Chai Xiangyu | Research, Develop, Projects, Blogs Algorithm Armadillo:成员函数和变量(一)

Armadillo:成员函数和变量(一)

@[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()

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Related Post