Armadillo:矩阵类、向量类、Cube类和泛型类
文章目录
- 矩阵类、向量类、Cube类和泛型类
- Mat<type>
- mat
- cx_mat
- Col<type>
- vec
- cx_vec
- Row<type>
- rowvec
- cx_rowvec
- Cube<type>
- cube
- cx_cube
- field<object_type>
- SpMat<type>
- sp_mat
- sp_cx_mat
- 运算符: + − * % / == != <= >= < > && ||
矩阵类、向量类、Cube类和泛型类
Mat
mat
cx_mat
密集矩阵的类,其元素按列优先顺序存储(即逐列)
根矩阵类是 Mat<type>
,其中 type
是以下项之一:
float
、double
、std::complex<float>
、std::complex<double>short
、int
、long
和无符号的 short
、int
、long
为方便起见,定义了以下 typedef:
mat = Mat<double>
dmat = Mat<double>
fmat = Mat<float>
cx_mat = Mat<cx_double>
cx_dmat = Mat<cx_double>
cx_fmat = Mat<cx_float>
umat = Mat<uword>
imat = Mat<sword>
在本文档中,为了方便起见,使用了垫子类型; 可以使用其他矩阵类型来代替,例如FMAT
系列。
具有整数元素的矩阵类型(如 umat
和 imat
)不能包含特殊值,如 NaN
和 Inf
。
使用 LAPACK 的函数(通常为矩阵分解)仅对以下矩阵类型有效:mat
、dmat
、fmat
、cx_mat
、cx_dmat`` cx_fmat
构造函数:
mat()
mat(n_rows, n_cols)
mat(n_rows, n_cols, fill_form) (元素根据 fill_form 进行初始化)
mat(size(X))
mat(size(X), fill_form) (元素根据 fill_form 进行初始化)
mat(mat)
mat(vec)
mat(rowvec)
mat(initializer_list)
mat(string)
mat(std::vector) (被视为列向量)
mat(sp_mat) (用于将稀疏矩阵转换为密集矩阵)
cx_mat(mat,mat) (用于从两个实数矩阵中构造一个复矩阵)
这些元素可以在构造过程中通过指定 fill_form 来显式初始化,这是其中之一:
fill::zeros ↦ 将所有元素设置为 0
fill::ones ↦ 将所有元素设置为 1
fill::eye ↦ 将主对角线上的元素设置为 1,将非对角线上的元素设置为 0
fill::randu ↦ 将所有元素设置为 [0,1] 区间内均匀分布中的随机值
fill::randn ↦ 将所有元素设置为均值和单位方差为零的正态/高斯分布中的随机值
fill::value(scalar) ↦ 将所有元素设置为指定的标量
fill::none ↦ 不要初始化元素
警告:
从Armadillo 10.5 开始,元素默认初始化为零
在 Armadillo 10.4 及更早版本中,除非指定fill_form否则不会初始化元素; 即,如果不指定fill_form,元素可能包含垃圾值,包括NaN
对于 mat(string) 构造函数,格式是用空格分隔的元素,用分号表示的行; 例如,可以使用 ; 请注意,基于字符串的初始化比直接设置元素或使用元素初始化(“1 0; 0 1”)要慢
每个 mat 实例都会自动分配和释放内部存储器。 一旦实例超出范围,mat 实例使用的所有内部分配的内存都会自动释放。 例如,如果在函数中声明了 mat 的实例,它将在函数结束时自动销毁。 要在任何时候强制释放内存,请使用 .reset();请注意,在正常使用中,这不是必需的。
高级构造函数:
mat(ptr_aux_mem, n_rows, n_cols, copy_aux_mem = true, strict = false)
使用来自可写辅助(外部)存储器的数据创建矩阵,其中 ptr_aux_mem
是指向存储器的指针。 默认情况下,矩阵分配自己的内存并从辅助内存中复制数据(为了安全起见)。 但是,如果 copy_aux_mem
设置为 false
, 矩阵将直接使用辅助存储器(即不复制); 这更快,但除非您知道自己在做什么,否则可能会很危险!
严格参数仅在 copy_aux_mem
设置为 false 时生效(即矩阵直接使用辅助存储器)
当 strict
设置为 false
时,矩阵将使用辅助存储器,直到大小更改或出现别名事件
当 strict
设置为 true
时,矩阵将在其生命周期内绑定到辅助存储器; 矩阵中的元素数无法更改
mat(const ptr_aux_mem, n_rows, n_cols)
通过从只读辅助存储器复制数据来创建矩阵, 其中 ptr_aux_mem
是指向内存的指针
mat::fixed<n_rows, n_cols>
创建一个固定大小的矩阵,其大小通过模板参数指定。 矩阵的内存在编译时保留。 这通常比动态内存分配更快,但之后无法(直接或间接)更改矩阵的大小。
为方便起见,每个矩阵类型都有几个预定义的 typedef (其中类型为:UMAT
、IMAT
、FMAT
、MAT
、cx_fmat
、cx_mat
)。 typedefs 指定方阵大小,范围从 2x2 到 9x9。 typedefs 是通过将大小的两位数形式附加到矩阵类型来定义的; 示例:mat33
等效于 mat::fixed<3,3>
, 而 cx_mat44
等效于 cx_ma::fixed<4,4>
。
mat::fixed<n_rows, n_cols>(fill_form)
创建一个固定大小的矩阵,其中元素根据fill_form
显式初始化
mat::fixed<n_rows, n_cols>(const ptr_aux_mem)
创建一个固定大小的矩阵,其大小通过模板参数指定; 数据从辅助内存复制,其中 ptr_aux_mem
是指向内存的指针
例子:
mat A(5, 5, fill::randu);
double x = A(1,2);mat B = A + A;
mat C = A * B;
mat D = A % B;cx_mat X(A,B);B.zeros();
B.set_size(10,10);
B.ones(5,6);B.print("B:");mat::fixed<5,6> F;double aux_mem[24];
mat H(&aux_mem[0], 4, 6, false); // use auxiliary memory
另请参阅:
matrix attributes
accessing elements
initialising elements
math & relational operators
submatrix views
saving & loading matrices
printing matrices
element iterators
.eval()
conv_to() (在矩阵类型之间转换)
Col class
Row class
Cube class
SpMat 类(具有压缩稀疏列格式的稀疏矩阵)
config.hpp
TypeDef的解释 (cplusplus.com)
C 数据类型 (维基百科)
Col
vec
cx_vec
列向量的类(具有一列的密集矩阵)
Col<type>
类派生自 Mat<type>
类 并继承了大部分成员函数
为方便起见,定义了以下 typedef:
vec = colvec = Col<double>
dvec = dcolvec = Col<double>
fvec = fcolvec = Col<float>
cx_vec = cx_colvec = Col<cx_double>
cx_dvec = cx_dcolvec = Col<cx_double>
cx_fvec = cx_fcolvec = Col<cx_float>
uvec = ucolvec = Col<uword>
ivec = icolvec = Col<sword>
vec和 colvec类型具有相同的含义,可以互换使用
在本文档中,为方便起见,使用了 vec
或 colvec
类型;可以使用其他列向量类型来代替,例如。FVEC、FCOLVEC
以 Mat 为输入的函数通常也可以以 Col 为输入; 主要的例外是需要平方矩阵的函数
构造函数:
vec()
vec(n_elem)
vec(n_elem, fill_form) (元素根据 fill_form 进行初始化)
vec(size(X))
vec(size(X), fill_form) (元素根据 fill_form 进行初始化)
vec(vec)
vec(mat) (如果给定矩阵具有多列,则会引发 std::logic_error 异常)
vec(initializer_list)
vec(string) (用空格分隔的元素)
vec(std::vector)
cx_vec(vec,vec) (用于从两个实向量中构造一个复向量)
警告:
从Armadillo 10.5 开始,元素默认初始化为零
在 Armadillo 10.4 及更早版本中,除非指定fill_form
否则不会初始化元素; 即。如果不指定fill_form
,元素可能包含垃圾值,包括 NaN
;有关fill_form
的详细信息,请参阅 Mat 类
高级构造函数:
vec(ptr_aux_mem, number_of_elements, copy_aux_mem = true, strict = false)
使用来自可写辅助(外部)存储器的数据创建列向量,其中 ptr_aux_mem
是指向内存的指针。 默认情况下,向量分配自己的内存并从辅助内存中复制数据(为了安全起见)。 但是,如果 copy_aux_mem
设置为 false
, 向量将直接使用辅助存储器(即不复制); 这更快,但除非您知道自己在做什么,否则可能会很危险!
严格参数仅在 copy_aux_mem
设置为 false 时生效(即向量直接使用辅助存储器)
当 strict
设置为 false
时,向量将使用辅助存储器,直到大小更改或出现混叠事件
当 strict
设置为 true
时,向量将在其生命周期内绑定到辅助存储器; 无法更改向量中的元素数
vec(const ptr_aux_mem, number_of_elements)
通过从只读辅助存储器复制数据来创建列向量, 其中 ptr_aux_mem
是指向内存的指针
vec::fixed<number_of_elements>
创建一个固定大小的列向量,其大小通过 template 参数指定。 向量的内存在编译时保留。 这通常比动态内存分配更快,但事后无法(直接或间接)更改向量的大小。
为方便起见,每个向量类型都有几个预定义的 typedef (其中类型为:UVEC、IVEC、FVEC、VEC、cx_fvec、cx_vec以及相应的 COLVEC 版本)。 预定义的 typedef 指定范围为 2 到 9 的向量大小。 typedefs 是通过将大小的单位数形式附加到向量类型来定义的; 示例:vec3
等效于 vec::fixed<3>
, 而 cx_vec4
等效于 cx_vec::fixed<4>
。
vec::fixed<number_of_elements>(fill_form)
创建一个固定大小的列向量,并根据fill_form显式初始化元素
vec::fixed<number_of_elements>(const ptr_aux_mem)
创建一个固定大小的列向量,其大小通过 template 参数指定; 数据从辅助内存复制,其中 ptr_aux_mem
是指向内存的指针
例子:
vec x(10);
vec y(10, fill::ones);mat A(10, 10, fill::randu);
vec z = A.col(5); // extract a column vector
另请参阅:
element initialisation
Mat class
Row class
Row
rowvec
cx_rowvec
行向量的类(具有一行的密集矩阵)
模板 Row<type>
类派生自 Mat<type>
类 并继承了大部分成员函数
为方便起见,定义了以下 typedef:
rowvec = Row<double>
drowvec = Row<double>
frowvec = Row<float>
cx_rowvec = Row<cx_double>
cx_drowvec = Row<cx_double>
cx_frowvec = Row<cx_float>
urowvec = Row<uword>
irowvec = Row<sword>
在本文档中,为了方便起见,使用了 rowvec
类型; 可以使用其他行向量类型来代替,例如frowvec
以 Mat
为输入的函数通常也可以以 Row
为输入; 主要的例外是需要平方矩阵的函数
构造函数:
rowvec()
rowvec(n_elem)
rowvec(n_elem, fill_form) (元素根据 fill_form 进行初始化)
rowvec(size(X))
rowvec(size(X), fill_form) (元素根据 fill_form 进行初始化)
rowvec(rowvec)
rowvec(mat) (std::logic_error 如果给定矩阵有多行,则抛出异常)
rowvec(initializer_list)
rowvec(string) (用空格分隔的元素)
rowvec(std::vector)
cx_rowvec(rowvec,rowvec) (用于从两个实行向量中构造一个复数行向量)
警告:
从Armadillo 10.5 开始,元素默认初始化为零
在 Armadillo 10.4 及更早版本中,除非指定fill_form
否则不会初始化元素; 即,如果不指定fill_form
,元素可能包含垃圾值,包括 NaN
;有关fill_form
的详细信息,请参阅 Mat
类
高级构造函数:
rowvec(ptr_aux_mem, number_of_elements, copy_aux_mem = true, strict = false)
使用来自可写辅助(外部)存储器的数据创建行向量,其中 ptr_aux_mem
是指向存储器的指针。 默认情况下,向量分配自己的内存并从辅助内存中复制数据(为了安全起见)。 但是,如果 copy_aux_mem
设置为 false
, 向量将直接使用辅助存储器(即不复制); 这更快,但除非您知道自己在做什么,否则可能会很危险!
严格参数仅在 copy_aux_mem
设置为 false
时生效(即向量直接使用辅助存储器)
当 strict
设置为 false
时,向量将使用辅助存储器,直到大小更改或出现混叠事件
当 strict
设置为 true
时,向量将在其生命周期内绑定到辅助存储器; 无法更改向量中的元素数
rowvec(const ptr_aux_mem, number_of_elements)
通过从只读辅助存储器复制数据来创建行向量, 其中 ptr_aux_mem
是指向内存的指针
rowvec::fixed<number_of_elements>
创建一个固定大小的行向量,其大小通过 template 参数指定。 向量的内存在编译时保留。 这通常比动态内存分配更快,但事后无法(直接或间接)更改向量的大小。
为方便起见,每个向量类型都有几个预定义的 typedef (其中类型为:urowvec
、irowvec
、frowvec
、rowvec
、cx_frowvec
、cx_rowvec
)。 预定义的 typedef 指定范围为 2 到 9 的向量大小。 typedefs 是通过将大小的单位数形式附加到向量类型来定义的; 示例:rowvec3
等效于 rowvec::fixed<3>
, 而 cx_rowvec4
等效于 cx_rowvec::fixed<4>
。
rowvec::fixed<number_of_elements>(fill_form)
创建一个固定大小的行向量,并根据fill_form
显式初始化元素
rowvec::fixed<number_of_elements>(const ptr_aux_mem)
创建一个固定大小的行向量,其大小通过 template 参数指定; 数据从辅助内存复制,其中 ptr_aux_mem
是指向内存的指针
例子:
rowvec x(10);
rowvec y(10, fill::ones);mat A(10, 10, fill::randu);
rowvec z = A.row(5); // extract a row vector
另请参阅:
element initialisation
Mat class
Col class
Cube
cube
cx_cube
立方体(准三阶张量)的类,也称为“三维矩阵”
数据存储为一组连续存储在内存中的切片(矩阵); 在每个切片中,元素以列优先顺序(即逐列)存储
根多维数据集类是 Cube<type>
,其中 type
是以下项之一:
float
、double
、std::complex<float>
、std::complex<double>short
、int
、long
和无符号版本的 short
、int
、long
为方便起见,定义了以下 typedef:
cube = Cube<double>
dcube = Cube<double>
fcube = Cube<float>
cx_cube = Cube<cx_double>
cx_dcube = Cube<cx_double>
cx_fcube = Cube<cx_float>
ucube = Cube<uword>
icube = Cube<sword>
在本文档中,为方便起见,使用了多维数据集类型; 可以使用其他类型来代替,例如fcube
构造函数:
cube()
cube(n_rows, n_cols, n_slices)
cube(n_rows, n_cols, n_slices, fill_form) (元素根据 fill_form 进行初始化)
cube(size(X))
cube(size(X), fill_form) (元素根据 fill_form 进行初始化)
cube(cube)
cx_cube(cube, cube) (用于从两个实立方体中构造一个复杂的立方体)
这些元素可以在构造过程中通过指定 fill_form
来显式初始化, 这是其中之一:
fill::zeros ↦ 将所有元素设置为 0
fill::ones ↦ 将所有元素设置为 1
fill::randu ↦ 将所有元素设置为 [0,1] 区间内均匀分布中的随机值
fill::randn ↦ 将所有元素设置为均值和单位方差为零的正态/高斯分布中的随机值
fill::value(scalar) ↦ 将所有元素设置为指定的标量
fill::none ↦ 不要初始化元素
警告:
从Armadillo 10.5 开始,元素默认初始化为零
在 Armadillo 10.4 及更早版本中,除非指定fill_form
否则不会初始化元素; 即。如果不指定fill_form
,元素可能包含垃圾值,包括 NaN
每个多维数据集实例都会自动分配和释放内部存储器。 一旦实例超出范围,多维数据集实例使用的所有内部分配的内存都会自动释放。 例如,如果在函数中声明了 cube 的实例,它将在函数结束时自动销毁。 要在任何时候强制释放内存,请使用 .reset()
;请注意,在正常使用中,这不是必需的。
高级构造函数:
cube::fixed<n_rows, n_cols, n_slices>
创建一个固定大小的多维数据集,其大小通过模板参数指定。 多维数据集的内存在编译时保留。 这通常比动态内存分配更快,但之后无法(直接或间接)更改多维数据集的大小。
cube(ptr_aux_mem, n_rows, n_cols, n_slices, copy_aux_mem = true, strict = false)
使用可写辅助(外部)存储器中的数据创建多维数据集,其中 ptr_aux_mem
是指向内存的指针。 默认情况下,多维数据集分配自己的内存,并从辅助内存中复制数据(为了安全起见)。 但是,如果 copy_aux_mem
设置为 false
, 立方体将直接使用辅助存储器(即不复制); 这更快,但除非您知道自己在做什么,否则可能会很危险!
strict
参数仅在 copy_aux_mem
设置为 false
时生效(即 Cube 直接使用辅助存储器)
当 strict
设置为 false
时,多维数据集将使用辅助内存,直到大小更改或出现别名事件
当 strict
设置为 true
时,多维数据集将在其生存期内绑定到辅助内存; 无法更改多维数据集中的元素数
cube(const ptr_aux_mem, n_rows, n_cols, n_slices)
通过从只读辅助存储器复制数据来创建多维数据集, 其中 ptr_aux_mem
是指向内存的指针
例子:
cube x(1, 2, 3);
cube y(4, 5, 6, fill::randu);mat A = y.slice(1); // extract a slice from the cube// (each slice is a matrix)mat B(4, 5, fill::randu);
y.slice(2) = B; // set a slice in the cubecube q = y + y; // cube addition
cube r = y % y; // element-wise cube multiplicationcube::fixed<4,5,6> f;
f.ones();
笔记:
每个立方体切片都可以解释为一个矩阵,因此将 Mat 作为输入的函数通常也可以将立方体切片作为输入
无法更改单个切片的大小。 例如,以下操作将不起作用:
cube c(5,6,7);
c.slice(0) = randu<mat>(10,20); // wrong size
另请参阅:
cube attributes
accessing elements
math & relational operators
subcube views and slices
saving & loading cubes
element iterators
field class
Mat class
field<object_type>
用于在矩阵式或立方体式布局中存储任意对象的类
有点类似于矩阵或立方体,但不是每个元素都是标量, 每个元素可以是向量、矩阵或立方体
每个元素可以具有任意大小(例如,在矩阵字段中,每个矩阵可以具有唯一的大小)
构造函数,其中 object_type
是另一个类,例如。vec
、mat
、std::string
等:
field<object_type>()
field<object_type>(n_elem)
field<object_type>(n_rows, n_cols)
field<object_type>(n_rows, n_cols, n_slices)
field<object_type>(size(X))
field<object_type>(field<object_type>)
警告: 要存储一组相同大小的矩阵,Cube
类效率更高
例子:
mat A = randn(2,3);
mat B = randn(4,5);field<mat> F(2,1);
F(0,0) = A;
F(1,0) = B; F.print("F:");F.save("mat_field");
另请参阅:
field attributes
subfield views
saving / loading fields
Cube class
SpMat
sp_mat
sp_cx_mat
稀疏矩阵的类;用于存储大型矩阵,其中大多数元素为零
根稀疏矩阵类是 SpMat<type>
,其中 type
是以下项之一:
float
、double
、std::complex<float>
、std::complex<double>
、short
、int
、long
和 无符号版本的short
、int
、long
为方便起见,定义了以下 typedef:
sp_mat = SpMat<double>
sp_dmat = SpMat<double>
sp_fmat = SpMat<float>
sp_cx_mat = SpMat<cx_double>
sp_cx_dmat = SpMat<cx_double>
sp_cx_fmat = SpMat<cx_float>
sp_umat = SpMat<uword>
sp_imat = SpMat<sword>
在本文档中,为了方便起见,使用了sp_mat
类型; 可以使用其他类型来代替,例如sp_fmat
构造函数:
sp_mat()
sp_mat(n_rows, n_cols)
sp_mat(size(X))
sp_mat(sp_mat)
sp_mat(mat) (用于将密集矩阵转换为稀疏矩阵)
sp_cx_mat(sp_mat,sp_mat) (用于从两个实数矩阵中构造一个复矩阵)
默认情况下,所有元素都被视为零(即矩阵初始化为包含零)
非零元素以压缩稀疏列 (CSC) 格式存储(即列优先排序); 从不存储零值元素
此类的行为方式与密集矩阵 Mat 类类似; 但是,故意省略了将所有元素设置为非零值的成员函数(因此对稀疏矩阵没有意义); 省略函数示例:.fill()
、.ones()
、+=
标量等。
注意:稀疏矩阵类不适用于小矩阵(例如,大小≤ 100x100),因为压缩存储格式的开销; 对于小矩阵,即使大多数元素为零,也使用 Mat 类
批量插入构造函数:
形式1:sp_mat(locations, values, sort_locations = true)
形式 2:sp_mat(locations, values, n_rows, n_cols, sort_locations = true, check_for_zeros = true)
形式 3:sp_mat(add_values, locations, values, n_rows, n_cols, sort_locations = true, check_for_zeros = true)
形式 4:sp_mat(rowind, colptr, values, n_rows, n_cols, check_for_zeros = true)
对于形式 1、2、3,locations
是 umat
类型的致密矩阵,大小为 2 x N
,其中 N 是要插入的值的数量; 第 i 个元素的位置由位置矩阵的第 i 列的内容指定, 其中行位于 locations(0,i)
中,列位于 locations(1,i)
中
对于形式 4,rowind
是 uvec
类型的密集列向量,包含要插入的值的行索引, colptr 是 UVEC 类型的密集列向量(长度为 n_cols + 1
),包含对应于新列开头的值的索引; 向量对应于压缩稀疏列格式使用的数组; 此表单可用于从其他 CSC 稀疏矩阵容器复制数据
对于所有形式,values 是包含要插入的值的密集列向量; 它必须具有与稀疏矩阵相同的元素类型。 对于表单 1 和 2,values[i]
中的值将插入到位置矩阵的第 i 列指定的位置。
对于形式 3,add_values
要么是 true
要么是 false
;设置为 true
时,允许相同的位置,并添加相同位置的值
构造矩阵的大小为 根据位置矩阵(表单 1)中的最大位置自动确定, 或 通过n_rows
和n_cols
手动指定(形式 2、3、4)
如果sort_locations
设置为 false
,则假定位置矩阵包含已根据列主要排序排序的位置;除非您知道自己在做什么,否则不要将其设置为 false
!
如果check_for_zeros
设置为 false
,则假定值向量不包含零值;除非您知道自己在做什么,否则不要将其设置为 false!
以下操作和函数的子集可用于稀疏矩阵:
基本算术运算(如加法和乘法)
子矩阵视图:X.cols(vector_of_column_indices)
的大多数连续形式和非连续形式
对角线视图
保存和加载(使用 arma_binary
、coord_ascii
和 csv_ascii 格式)
元素函数:abs()
、cbrt()
、ceil()
、conj()
、floor()
、imag()
、real()
、round()
、sign()
、sqrt()
、square()
、trunc()
矩阵的标量函数:accu()
、as_scalar()
、dot()
、norm()
、norm2est()
、trace()
矩阵的向量值函数:diagvec()
、min()
、max()
、nonzeros()
、sum()
、mean()
、var()
、vecnorm()
、vectorise()
矩阵的矩阵值函数: clamp()
, diagmat()
, spdiags()
, flipud()/fliplr()
, join_rows()
, join_cols()
, kron()
, normalise()
, repelem()
, repmat()
, reshape()
, resize()
, reverse()
, shift()
, symmatu()/symmatl()
, trimatu()/trimatl()
, .t()
、trans()
生成矩阵:speye()
、spones()
、sprandu()
、sprandn()
、zeros()
特征分解和 SVD:eigs_sym()
、eigs_gen()
、svds()
稀疏线性系统的解:spsolve()
其他:approx_equal()
、元素访问、元素迭代器、.as_col()/.as_row()
、.for_each()
、.print()
、.clean()
、.replace()
、.transform()
、.is_finite()
、.is_symmetric()
、.is_hermitian()
、.is_trimatu()
、.is_trimatl()
、.is_diagmat()
例子:
sp_mat A = sprandu(1000, 2000, 0.01);
sp_mat B = sprandu(2000, 1000, 0.01);sp_mat C = 2*B;
sp_mat D = A*C;sp_mat E(1000,1000);
E(1,2) = 123;// batch insertion of 3 values at
// locations (1, 2), (7, 8), (9, 9)umat locations = { { 1, 7, 9 },{ 2, 8, 9 } };vec values = { 1.0, 2.0, 3.0 };sp_mat X(locations, values);
另请参阅:
element access
element iterators (稀疏矩阵)
printing matrices
Sparse Matrix in Wikipedia
Mat class (稠密矩阵)
运算符: + − * % / == != <= >= < > && ||
Mat、Col、Row 和 Cube 类的重载运算符
运算符:
符号 | 含义 |
---|---|
+ | 两个对象相加 |
− | 从另一个对象中减去一个对象或一个负数 |
* | 两个对象的矩阵乘法;不适用于 Cube 类,除非乘以标量 |
% | 两个对象的元素乘法(Schur 积) |
/ | 将一个对象逐个元素除以另一个对象或标量 |
== | 两个对象的元素相等性评估;生成 umat/ucube 类型的矩阵/立方体 |
!= | 两个对象的元素不相等评估;生成 umat/ucube 类型的矩阵/立方体 |
>= | 对两个对象进行元素“大于或等于”评估;生成 umat/ucube 类型的矩阵/立方体 |
<= | 对两个对象进行元素“小于或等于”评估;生成 umat/ucube 类型的矩阵/立方体 |
> | 对两个对象进行元素“大于”评估;生成 umat/ucube 类型的矩阵/立方体 |
< | 对两个对象进行元素“小于”评估;生成 umat/ucube 类型的矩阵/立方体 |
&& | 两个对象的逐元素逻辑 AND 计算;生成 umat/ucube 类型的矩阵/立方体 |
|| | 两个对象的逐元素逻辑 OR 求值;生成 umat/ucube 类型的矩阵/立方体 |
用于元素关系和逻辑操作(比如 , , , , , , , ) 生成的对象中的每个元素都是 0 或 1,具体取决于操作的结果==!=>=<=><&&||
注意:涉及相等比较的运算符(比如 , , ,) 不建议用于 mat 或 fmat 类型的矩阵, 由于浮点元素类型的精度必然有限; 考虑改用 approx_equal()==!=>=<=
如果 和 运算符是链接的,则 Armadillo 旨在避免生成临时值; 如果所有给定对象的类型和大小相同,则不会生成临时对象+−%
如果算子是链式的,Armadillo 的目标是找到矩阵乘法的有效排序*
广播操作可通过 .each_col()
、.each_row()
、.each_slice()
进行
如果使用不兼容的对象大小,则会引发 std::logic_error
异常
例子:
mat A(5, 10, fill::randu);
mat B(5, 10, fill::randu);
mat C(10, 5, fill::randu);mat P = A + B;
mat Q = A - B;
mat R = -B;
mat S = A / 123.0;
mat T = A % B;
mat U = A * C;// V is constructed without temporaries
mat V = A + B + A + B;imat AA = "1 2 3; 4 5 6; 7 8 9;";
imat BB = "3 2 1; 6 5 4; 9 8 7;";// compare elements
umat ZZ = (AA >= BB);
另请参阅:
approx_equal()
pow()
any()
all()
affmul()
accu()
as_scalar()
find()
.replace()
.transform()
.each_col() 和 .each_row() (应用于每列或每行的向量运算)
其他元素函数(exp、log、sqrt、square、round 等)
维基百科中的浮点运算
MathWorld 中的浮点表示
相关文章:

Armadillo:矩阵类、向量类、Cube类和泛型类
文章目录 矩阵类、向量类、Cube类和泛型类Mat<type>matcx_matCol<type>veccx_vecRow<type>rowveccx_rowvecCube<type>cubecx_cubefield<object_type>SpMat<type>sp_matsp_cx_mat运算符: − * % / ! < > <…...

【守护健康】小脑萎缩患者必备营养指南
当生活给予我们挑战,我们选择用科学和关爱予以回应。面对小脑萎缩这一难题,正确的营养补充不仅是一剂强心针,更是患者康复之路上的坚实伙伴。今天,让我们一起了解那些能够助力小脑萎缩患者的神奇维生素! 1. 维生素B群…...

lvs集群中NAT模式
群集的含义 由多台主机构成,但对外表现为一个整体,只提供一个访问入口,相当于一台大型的计算机。 横向发展:放更多的服务器,有调度分配的问题。 垂直发展:升级单机的硬件设备,提高单个服务器自身功能。 …...

FPGA——三速自适应以太网设计(2)GMII与RGMII接口
FPGA——以太网设计(2)GMII与RGMII 基础知识(1)GMII(2)RGMII(3)IDDR GMII设计转RGMII接口跨时钟传输模块 基础知识 (1)GMII GMII:发送端时钟由MAC端提供 下…...

【校园导航小程序】2.0版本 静态/云开发项目 升级日志
演示视频 【校园导航小程序】2.0版本 静态/云开发项目 演示 首页 重做了首页,界面更加高效和美观 校园指南页 新增了 “校园指南” 功能,可以搜索和浏览校园生活指南 地图页 ①弃用路线规划插件,改用SDK开发包。可以无阻通过审核并发布…...

深入揭秘Lucene:全面解析其原理与应用场景(二)
本系列文章简介: 本系列文章将深入揭秘Lucene,全面解析其原理与应用场景。我们将从Lucene的基本概念和核心组件开始,逐步介绍Lucene的索引原理、搜索算法以及性能优化策略。通过阅读本文,读者将会对Lucene的工作原理有更深入的了解…...

Java中synchronized关键字、ReentrantLock、volatile关键字是如何实现线程同步的。
在Java中,synchronized关键字、ReentrantLock和volatile关键字这三个是编程中常用于实现线程同步的机制,下面结合代码详细说明一下这三个关键字的用法。 1. synchronized关键字: synchronized关键字是Java语言提供的内置锁机制,…...

路由拦截器
路由拦截可以分为几种不同的类型,每种类型都有其特定的作用和适用场景。以下是常见的几种路由拦截类型及其用途: 身份验证拦截器: 作用: 检查用户是否已经登录或具有有效的身份认证,并根据认证状态决定是否允许用户访问…...

Springboot+vue的物业管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。
演示视频: Springbootvue的物业管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的物业管理系统,采用M(model)Vÿ…...

STM32的启动流程分析 和 一些底层控制的原理
阅读引言: 阅读本文之后, 你将对单片机, 甚至是嵌入式系统, 或者是传统的PC机系统的启动流程有一个大致的了解, 本文更加偏向于单片机的启动流程分析。 目录 一、基础知识 1.STM32系列的微控制器(mcu&…...

C#面:几种注释类型
三种常见的注释类型:单行注释、多行注释和 XML 注释。 单行注释: 以双斜线 // 开头,用于在一行中注释单个语句或代码块。单行注释会被编译器忽略,不会对程序的执行产生任何影响。 例如: // 这是一个单行注释 int a…...

#onenet网络请求http(GET,POST)
参考博文: POST: https://blog.csdn.net/qq_43350239/article/details/104361153 POST请求(用串口助手测试): POST /devices/1105985351/datapoints HTTP/1.1 api-key:AdbrV5kCRsKsRCfjboYOCVcF9FY Host:api.heclouds.com Con…...

零基础学习JS--基础篇--索引集合类
数组是由名称和索引引用的值构成的有序列表。 JavaScript 中没有明确的数组数据类型。但是,你可以使用预定义的 Array 对象及其方法来处理应用程序中的数组。Array 对象具有以各种方式操作数组的方法,例如连接、反转和排序。它有一个用于确定数组长度的…...

【硬件工程师面经整理25_AD】
文章目录 1 AD设计电路全流程2 ad和cadence区别-逻辑上的区别 1 AD设计电路全流程 软件AD or 模拟数字? 软件AD:AD设计电路全流程包括以下步骤:选择AD库和添加、画原理图、PCB布局、PCB布线、PCB打样、PCB加工 模拟数字: 需求分…...

神经网络的矢量化,训练与激活函数
我们现在再回到我们的神经元部分,来看我们如何用python进行正向传递。 单层的正向传递: 我们回到我们的线性回归的函数。我们每个神经元通过上述的方法,就可以得到我们的激发值,从而可以继续进行下一层。 我们用这个方法就可以得…...

3.7号freeRtoS
1. 串口通信 配置串口为异步通信 设置波特率,数据位,校验位,停止位,数据的方向 同步通信 在同步通信中,数据的传输是在发送端和接收端之间通过一个共享的时钟信号进行同步的。这意味着发送端和接收端的时钟需要保持…...

瑞芯微 | I2S-音频基础 -1
最近调试音频驱动,顺便整理学习了一下i2s、alsa相关知识,整理成了几篇文章,后续会陆续更新。 喜欢嵌入式、Li怒晓得老铁可以关注一口君账号。 1. 音频常用术语 名称含义ADC(Analog to Digit Conversion)模拟信号转换…...

Linux配置.bashrc文件导致各种命令(vim、sudo)失效。
Linux配置.bashrc文件导致各种命令(vim、sudo)失效。 起因是 nvcc-V一直报错:-bash:nvcc: command not found 踩坑记录:上网一查说是没有配置cuda的环境变量。于是去修改了bashrc文件,在最下面…...

Visual Studio 2022 Version 17.9 新功能
Visual Studio 2022 v17.9 为广大 C 开发者引入了一系列好用的新功能和改进优化。 内存布局 现在,你可以使用【内存布局,Memory Layout】功能以可视化的方式来查看对象,结构体及联合体的内存布局信息,这可比以前需要手动查看内存…...

ArrayList 和 LinkedList 的区别
ArrayList ArrayList 是基于动态数组实现的, 它使用一块连续的内存空间来存储元素,因此访问元素的速度非常快(时间复杂度为 O(1)), 但是,在插入或删除元素时,如果位置不在数组末尾࿰…...

VGG16-CF-VGG11实验报告
说明:VGG16和CF-VGG11是论文《A 3D Fluorescence Classification and Component Prediction Method Based on VGG Convolutional Neural Network and PARAFAC Analysis Method》使用的两种主要模型。其对应代码仓库提供了实验使用的数据集、平行因子分析结果和CNN模型。论文和…...

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用
基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘…...

uniapp使用华为云OBS进行上传
前言:无论是使用华为云还是阿里云,使用其产品的时候必须阅读文档 1、以华为云为例,刚接触此功能肯定是无从下手的情况,那么我们需要思考,我们使用该产品所用到的文档是什么 2、我们要使用obs 文件上传,肯…...

用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 问题描述:在 Windows 环境中,您希望通过一个 Python 脚本来实现特定的自动化任务,该任务需要依次运行其他多个带 argparse 命令行参数的 .py 文件。您希望找到一种简…...

力扣热题100_普通数组_189_轮转数组
文章目录 题目链接解题思路解题代码 题目链接 189. 轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] …...

讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
1.需求 最近linux下的Qt项目中要连接oracle数据库,用户需要我们访问他们的oracle数据库,查询数据 2.遇到的问题 qt连接oracle数据库需要oracle的驱动库libqsqloci.so插件,需要编译下,之前没有编译过,看了网上的…...

SpringCloud Ribbon 负载均衡服务调用
一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第三篇,即介绍 Ribbon 负载均衡服务调用 二、概述 2.1 Ribbon 是什么 Spring Cloud Ribbon…...

物联网在智慧城市建设中的关键作用:连接、感知、智能响应
一、引言 随着信息技术的飞速发展,物联网(IoT)技术已经渗透到我们生活的方方面面,特别是在智慧城市建设中发挥着至关重要的作用。智慧城市是指通过运用先进的信息和通信技术,实现城市基础设施、公共服务、交通管理、环…...

安卓7原生相机切到视频崩溃
目录 1、查看日志 2、分析日志、提取重点 3、寻找解决方法 author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye_嵌入式,Linux,Qt-CSDN博客daisy.skye擅长嵌入式,Linux,Qt,等方面的知识https://blog.csdn.net/qq_40715266?typeblog 1、查看日志 由于安…...

构建信息蓝图:概念模型与E-R图的技术解析
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…...