@[toc]

属性
.n_rows 行数;存在于 Mat、Col、Row、Cube、field 和 SpMat 中
.n_cols 列数;存在于 Mat、Col、Row、Cube、field 和 SpMat 中
.n_elem 元素总数;存在于 Mat、Col、Row、Cube、field 和 SpMat 中
.n_slices 切片数量;存在于多维数据集和字段中
.n_nonzero 非零元素的数量;存在于 SpMat 中
变量的类型为 uword
变量是只读的; 要更改大小,请使用 .set_size()、.copy_size()、.zeros()、.ones()、 或者 .reset()
对于 Col 和 Row 类,n_elem 还指示向量长度
例子:
mat X(4,5);
cout << "X has " << X.n_cols << " columns" << endl;
另请参阅:
.set_size()
.copy_size()
.zeros()
.ones()
.reset()
size()
通过 ()、[] 和 .at() 访问元素/对象
提供对存储在容器对象中的单个元素或对象的访问 (即Mat, Col, Row, Cube, field)
(i) 对于 vec 和 rowvec,访问存储在索引 i 中的元素。 对于垫、立方体和字段,在平面布局的假设下访问存储在索引 i 处的元素/对象, 对数据进行列优先排序(即逐列)。 如果请求的元素越界,则会引发异常。
.at(i)或[i] 至于(i),没有边界检查;不推荐;请参阅下面的注意事项
(r,c) 对于 mat 和 2D 字段类,访问存储在第 r 行和 c 列中的元素/对象。 如果请求的元素越界,则会引发异常。
.at(r,c) 至于(r,c),没有边界检查;不推荐;请参阅下面的注意事项
(r,c,s) 对于多维数据集和 3D 字段类,访问存储在第 r 行、c 列和切片 s 中的元素/对象。 如果请求的元素越界,则会引发异常。
.at(r,c,s)
至于 ,但没有边界检查;不推荐;请参阅下面的注意事项(r,c,s)
元素的索引通过 uword 类型指定,uword 类型是无符号整数类型的 typedef。 使用循环访问元素时,最好使用 uword 而不是 int。 例如:for(uword i=0; i<X.n_elem; ++i) { X(i) = ... }
警告:
访问无边界元素检查的速度稍快,但在首先彻底调试代码之前不建议这样做
C++ 中的索引从 0 开始
通过[r,c]和[r,c,s]访问元素,在 C++ 中会无法正常工作; 请改用 (r,c)和(r,c,s)
例子:
mat M(10, 10, fill::randu);
M(9,9) = 123.0;
double x = M(1,2);
vec v(10, fill::randu);
v(9) = 123.0;
double y = v(0);
另请参阅:
.in_range()
element initialisation
ind2sub()
sub2ind()
.index_min() / .index_max()
submatrix views
.memptr()
.transform()
.for_each()
iterators (密集矩阵)
iterators (多维数据集)
iterators (稀疏矩阵)
config.hpp
元素初始化
通过带支撑的初始化器列表在 Mat、Col、Row 中设置元素
例子:
vec v = { 1, 2, 3 };
mat A = { {1, 3, 5},
{2, 4, 6} };
另请参阅:
element access
.reshape()
.print()
saving & loading matrices
advanced constructors (matrices)
.zeros() (Mat、Col、Row、SpMat、Cube 的成员函数)
.zeros( n_elem ) (Col 和 Row 的成员函数)
.zeros( n_rows, n_cols ) (Mat 和 SpMat 的成员函数)
.zeros( n_rows, n_cols, n_slices )(Cube 的成员函数)
.zeros(size(X)) (Mat、Col、Row、Cube、SpMat 的成员函数)
将对象的元素设置为零, (可选)首先将大小更改为指定尺寸
例子:
mat A;
A.zeros(5, 10); // or: mat A(5, 10, fill::zeros);
mat B;
B.zeros( size(A) );
mat C(5, 10, fill::randu);
C.zeros();
另请参阅:
zeros() (独立函数)
.ones()
.clean()
.is_zero()
.randu()
.fill()
.imbue()
.reset()
.set_size()
size()
.ones() (Mat, Col, Row, Cube的成员函数)
.ones( n_elem ) (Col 和 Row的成员函数)
.ones( n_rows, n_cols ) (Mat的成员函数)
.ones( n_rows, n_cols, n_slices ) (Cube的成员函数)
.ones( size(X) ) (Mat, Col, Row, Cube的成员函数)
将对象的所有元素设置为一个, (可选)首先将大小更改为指定尺寸
例子:
mat A;
A.ones(5, 10); // or: mat A(5, 10, fill::ones);
mat B;
B.ones( size(A) );
mat C(5, 10, fill::randu);
C.ones();
另请参阅:
ones() (独立函数)
.eye()
.zeros()
.fill()
.imbue()
.randu()
size()
.eye()
.eye( n_rows, n_cols )
.eye( size(X) )
Mat 和 SpMat 的成员函数
将沿主对角线的元素设置为 1,将非对角线元素设置为零, (可选)首先将大小更改为指定尺寸
当 n_rows = n_cols 时,将生成单位矩阵
例子:
mat A;
A.eye(5, 5); // or: mat A(5, 5, fill::eye);
mat B;
B.eye( size(A) );
mat C(5, 5, fill::randu);
C.eye();
另请参阅:
.ones()
.diag()
diagmat()
diagvec()
eye()(独立函数)
size()
.randu() (Mat, Col, Row, Cube的成员函数)
.randu( n_elem ) (Col 和 Row的成员函数)
.randu( n_rows, n_cols ) (Mat的成员函数)
.randu( n_rows, n_cols, n_slices ) (Cube的成员函数)
.randu( size(X) ) (Mat, Col, Row, Cube的成员函数)
.randn() (Mat, Col, Row, Cube的成员函数)
.randn( n_elem ) (Col 和 Row的成员函数)
.randn( n_rows, n_cols ) (Mat的成员函数)
.randn( n_rows, n_cols, n_slices ) (Cube的成员函数)
.randn( size(X) ) (Mat, Col, Row, Cube的成员函数)
将所有元素设置为随机值, (可选)首先将大小更改为指定尺寸
.randu() 在 [0,1] 区间内使用均匀分布
.randn() 使用均值和单位方差为零的正态/高斯分布
对于复杂元素,实部和虚部分开处理
例子:
mat A;
A.randu(5, 10); // or: mat A(5, 10, fill::randu);
mat B;
B.randu( size(A) );
mat C(5, 10, fill::zeros);
C.randu();
另请参阅:
randu() (具有扩展功能的独立函数)
randn() (具有扩展功能的独立函数)
.fill()
.imbue()
.ones()
.zeros()
size()
RNG seed setting
维基百科中的均匀分布
维基百科中的正态分布
.fill( value )
Mat、Col、Row、Cube、field 的成员函数
将元素设置为指定值
值的类型必须与容器对象使用的元素类型匹配(例如,对于 mat,类型为 double)
例子:
mat A(5, 6);
A.fill(123.0); // or: mat A(5, 6, fill::value(123.0));
注意:要在矩阵构造期间将所有元素设置为零,请使用以下更紧凑的形式:mat A(5, 6, fill::zeros);
另请参阅:
.imbue()
.ones()
.zeros()
.randu() & .randn()
.replace()
常量 (pi, nan, inf, ...)
.imbue( functor )
.imbue( lambda_function )
Mat、Col、Row 和 Cube 的成员函数
使用函子或 lambda 函数提供的值填充(填充)
对于矩阵,填充是逐列完成的(即填充第 0 列,然后填充第 1 列,…
对于立方体,填充是逐片完成的,每个切片都被视为一个基质
例子:
std::mt19937 engine; // Mersenne twister random number engine
std::uniform_real_distribution<double> distr(0.0, 1.0);
mat A(4, 5, fill::none);
A.imbue( [&]() { return distr(engine); } );
另请参阅:
.fill()
.transform()
元素访问
维基百科的函数对象
维基百科的C++11个lambda函数
cprogramming.com 处的 lambda 函数
.clean( threshold )
Mat、Col、Row、Cube 和 SpMat 的成员函数
对于具有非复杂元素的对象:每个具有绝对值≤阈值的元素都替换为零
对于具有复杂元素的对象:对于每个元素,具有绝对值≤阈值的每个分量(实数和虚数)都替换为零
可用于稀疏化矩阵,即对小幅度值的值进行归零
注意:若要显式从密集存储转换为稀疏存储,请使用 SpMat 类
例子:
sp_mat A;
A.sprandu(1000, 1000, 0.01);
A(12,34) = datum::eps;
A(56,78) = -datum::eps;
A.clean(datum::eps);
另请参阅:
.replace()
.clamp()
.transform()
.is_zero()
.zeros()
nonzeros()
datum::eps
.replace( old_value, new_value )
Mat、Col、Row、Cube 和 SpMat 的成员函数
对于所有等于 old_value 的元素,请将它们设置为 new_value
old_value和new_value的类型必须与容器对象使用的元素类型匹配(例如,对于 mat,类型为 double)
警告:
浮点数(浮点数和双精度数)是近似值,因为它们的精度必然有限
对于稀疏矩阵 (SpMat),当 old_value = 0 时不进行替换
例子:
mat A(5, 6, fill::randu);
A.diag().fill(datum::nan);
A.replace(datum::nan, 0); // replace each NaN with 0
另请参阅:
.transform()
.for_each()
.clean()
.clamp()
.fill()
.has_nan()
.has_inf()
find()
查找()
关系运算符
常量 (pi, nan, inf, ...)
.clamp( min_value, max_value )
Mat、Col、Row、Cube 和 SpMat 的成员函数
将每个元素夹紧到 [min_val, max_val] 区间;
任何低于 min_val 的值都将设置为 min_val,任何高于 max_val 的值都将设置为 max_val
对于复杂元素,实部和虚部分别夹紧
对于稀疏矩阵,钳位仅应用于非零单元
例子:
mat A(5, 6, fill::randu);
A.clamp(0.2, 0.8);
另请参阅:
.replace()
.clean()
.transform()
.for_each()
clamp() (独立函数)
关系运算符
.transform( functor )
.transform( lambda_function )
Mat、Col、Row、Cube 和 SpMat 的成员函数
使用函子或 lambda 函数转换每个元素
对于密集矩阵,所有元素的转换都是逐列完成的
对于稀疏矩阵,对非零元素进行逐列转换
对于立方体,转换是逐个切片完成的,每个切片都被视为一个矩阵
例子:
mat A(4, 5, fill::ones);
// add 123 to every element
A.transform( [](double val) { return (val + 123.0); } );
另请参阅:
.for_each()
.replace()
.imbue()
.clean()
.clamp()
元素访问
重载运算符
其他元素函数(exp、log、sqrt、square、round 等)
维基百科的函数对象
维基百科的C++11 lambda函数
cprogramming.com 处的 lambda 函数
.for_each( functor )
.for_each( lambda_function )
Mat、Col、Row、Cube、SpMat 和 field 的成员函数
对于每个元素,将其引用传递给函子或 lambda 函数
对于密集矩阵和字段,所有元素的处理都是逐列完成的
对于稀疏矩阵,对非零元素进行逐列处理
对于立方体,处理是逐个切片完成的,每个切片都被视为一个矩阵
例子:
// add 123 to each element in a dense matrix
mat A(4, 5, fill::ones);
A.for_each( [](mat::elem_type& val) { val += 123.0; } ); // NOTE: the '&' is crucial!
// add 123 to each non-zero element in a sparse matrix
sp_mat S; S.sprandu(1000, 2000, 0.1);
S.for_each( [](sp_mat::elem_type& val) { val += 123.0; } ); // NOTE: the '&' is crucial!
// set the size of all matrices in field F
field<mat> F(2,3);
F.for_each( [](mat& X) { X.zeros(4,5); } ); // NOTE: the '&' is crucial!
另请参阅:
.transform()
.replace()
.each_col() & .each_row()
.each_slice()
元素访问
其他元素函数(exp、log、sqrt、square、round 等)
维基百科的函数对象
维基百科的C++11个lambda函数
cprogramming.com 处的 lambda 函数
.set_size( n_elem ) (Col, Row, field的成员函数)
.set_size( n_rows, n_cols ) (Mat, SpMat, field的成员函数)
.set_size( n_rows, n_cols, n_slices ) (Cube 和 field的成员函数)
.set_size( size(X) ) (Mat, Col, Row, Cube, SpMat, field的成员函数)
更改对象的大小,而不显式保留数据,也不初始化元素(即元素可能包含垃圾值,包括 NaN)
要在更改大小时将元素初始化为零,请改用 .zeros()
要在更改大小时显式保留数据,请改用 .reshape() 或 .resize();
注意:.reshape() 和 .resize() 比 .set_size() 慢得多
例子:
mat A;
A.set_size(5, 10); // or: mat A(5, 10, fill::none);
mat B;
B.set_size( size(A) ); // or: mat B(size(A), fill::none);
vec v;
v.set_size(100); // or: vec v(100, fill::none);
另请参阅:
.reset()
.copy_size()
.reshape()
.resize()
.zeros()
size()