• Armadillo:矩阵类、向量类、Cube类和泛型类


    矩阵类、向量类、Cube类和泛型类

    Mat

    mat

    cx_mat

    密集矩阵的类,其元素按列优先顺序存储(即逐列)

    根矩阵类是 Mat,其中 type 是以下项之一:
    floatdoublestd::complexstd::complexshortintlong 和无符号的 shortintlong

    为方便起见,定义了以下 typedef:

    mat	 = 	Mat
    dmat	 = 	Mat
    fmat	 = 	Mat
    cx_mat	 = 	Mat
    cx_dmat	 = 	Mat
    cx_fmat	 = 	Mat
    umat	 = 	Mat
    imat	 = 	Mat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在本文档中,为了方便起见,使用了垫子类型; 可以使用其他矩阵类型来代替,例如FMAT系列。

    具有整数元素的矩阵类型(如 umatimat)不能包含特殊值,如 NaNInf

    使用 LAPACK 的函数(通常为矩阵分解)仅对以下矩阵类型有效:matdmatfmatcx_matcx_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)	 	(用于从两个实数矩阵中构造一个复矩阵)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这些元素可以在构造过程中通过指定 fill_form 来显式初始化,这是其中之一:

    fill::zeros	↦	将所有元素设置为 0
    fill::ones	↦	将所有元素设置为 1
    fill::eye	↦	将主对角线上的元素设置为 1,将非对角线上的元素设置为 0
    fill::randu	↦	将所有元素设置为 [0,1] 区间内均匀分布中的随机值
    fill::randn	↦	将所有元素设置为均值和单位方差为零的正态/高斯分布中的随机值
    fill::value(scalar)	↦	将所有元素设置为指定的标量
    fill::none	↦	不要初始化元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    警告:
    从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)
    
    • 1

    使用来自可写辅助(外部)存储器的数据创建矩阵,其中 ptr_aux_mem 是指向存储器的指针。 默认情况下,矩阵分配自己的内存并从辅助内存中复制数据(为了安全起见)。 但是,如果 copy_aux_mem 设置为 false, 矩阵将直接使用辅助存储器(即不复制); 这更快,但除非您知道自己在做什么,否则可能会很危险!

    严格参数仅在 copy_aux_mem 设置为 false 时生效(即矩阵直接使用辅助存储器)
    strict 设置为 false 时,矩阵将使用辅助存储器,直到大小更改或出现别名事件
    strict 设置为 true 时,矩阵将在其生命周期内绑定到辅助存储器; 矩阵中的元素数无法更改

    	mat(const ptr_aux_mem, n_rows, n_cols)
    
    • 1

    通过从只读辅助存储器复制数据来创建矩阵, 其中 ptr_aux_mem 是指向内存的指针

    	mat::fixed
    
    • 1

    创建一个固定大小的矩阵,其大小通过模板参数指定。 矩阵的内存在编译时保留。 这通常比动态内存分配更快,但之后无法(直接或间接)更改矩阵的大小。

    为方便起见,每个矩阵类型都有几个预定义的 typedef (其中类型为:UMATIMATFMATMATcx_fmatcx_mat)。 typedefs 指定方阵大小,范围从 2x2 到 9x9。 typedefs 是通过将大小的两位数形式附加到矩阵类型来定义的; 示例:mat33 等效于 mat::fixed<3,3>, 而 cx_mat44 等效于 cx_ma::fixed<4,4>

    mat::fixed(fill_form)
    
    • 1

    创建一个固定大小的矩阵,其中元素根据fill_form显式初始化

    mat::fixed(const ptr_aux_mem)
    
    • 1

    创建一个固定大小的矩阵,其大小通过模板参数指定; 数据从辅助内存复制,其中 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    另请参阅:

    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 数据类型 (维基百科)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Col

    vec

    cx_vec

    列向量的类(具有一列的密集矩阵)

    Col 类派生自 Mat 类 并继承了大部分成员函数

    为方便起见,定义了以下 typedef:

    vec	 = 	colvec	 = 	Col
    dvec	 = 	dcolvec	 = 	Col
    fvec	 = 	fcolvec	 = 	Col
    cx_vec	 = 	cx_colvec	 = 	Col
    cx_dvec	 = 	cx_dcolvec	 = 	Col
    cx_fvec	 = 	cx_fcolvec	 = 	Col
    uvec	 = 	ucolvec	 = 	Col
    ivec	 = 	icolvec	 = 	Col
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    veccolvec类型具有相同的含义,可以互换使用

    在本文档中,为方便起见,使用了 veccolvec 类型;可以使用其他列向量类型来代替,例如。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)	 	(用于从两个实向量中构造一个复向量)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    警告:
    从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)
    
    • 1

    使用来自可写辅助(外部)存储器的数据创建列向量,其中 ptr_aux_mem 是指向内存的指针。 默认情况下,向量分配自己的内存并从辅助内存中复制数据(为了安全起见)。 但是,如果 copy_aux_mem 设置为 false, 向量将直接使用辅助存储器(即不复制); 这更快,但除非您知道自己在做什么,否则可能会很危险!

    严格参数仅在 copy_aux_mem 设置为 false 时生效(即向量直接使用辅助存储器)
    strict 设置为 false 时,向量将使用辅助存储器,直到大小更改或出现混叠事件
    strict 设置为 true 时,向量将在其生命周期内绑定到辅助存储器; 无法更改向量中的元素数

    vec(const ptr_aux_mem, number_of_elements)
    
    • 1

    通过从只读辅助存储器复制数据来创建列向量, 其中 ptr_aux_mem 是指向内存的指针

    vec::fixed
    
    • 1

    创建一个固定大小的列向量,其大小通过 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(fill_form)
    
    • 1

    创建一个固定大小的列向量,并根据fill_form显式初始化元素

    vec::fixed(const ptr_aux_mem)
    
    • 1

    创建一个固定大小的列向量,其大小通过 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    另请参阅:

    element initialisation
    Mat class
    Row class
    
    • 1
    • 2
    • 3

    Row

    rowvec

    cx_rowvec

    行向量的类(具有一行的密集矩阵)

    模板 Row 类派生自 Mat 类 并继承了大部分成员函数

    为方便起见,定义了以下 typedef:

    rowvec	 = 	Row
    drowvec	 = 	Row
    frowvec	 = 	Row
    cx_rowvec	 = 	Row
    cx_drowvec	 = 	Row
    cx_frowvec	 = 	Row
    urowvec	 = 	Row
    irowvec	 = 	Row
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在本文档中,为了方便起见,使用了 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)	 	(用于从两个实行向量中构造一个复数行向量)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    警告:
    从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)
    
    • 1

    使用来自可写辅助(外部)存储器的数据创建行向量,其中 ptr_aux_mem 是指向存储器的指针。 默认情况下,向量分配自己的内存并从辅助内存中复制数据(为了安全起见)。 但是,如果 copy_aux_mem 设置为 false, 向量将直接使用辅助存储器(即不复制); 这更快,但除非您知道自己在做什么,否则可能会很危险!

    严格参数仅在 copy_aux_mem 设置为 false 时生效(即向量直接使用辅助存储器)
    strict 设置为 false 时,向量将使用辅助存储器,直到大小更改或出现混叠事件
    strict 设置为 true 时,向量将在其生命周期内绑定到辅助存储器; 无法更改向量中的元素数

    rowvec(const ptr_aux_mem, number_of_elements)
    
    • 1

    通过从只读辅助存储器复制数据来创建行向量, 其中 ptr_aux_mem 是指向内存的指针

    rowvec::fixed
    
    • 1

    创建一个固定大小的行向量,其大小通过 template 参数指定。 向量的内存在编译时保留。 这通常比动态内存分配更快,但事后无法(直接或间接)更改向量的大小。

    为方便起见,每个向量类型都有几个预定义的 typedef (其中类型为:urowvecirowvecfrowvecrowveccx_frowveccx_rowvec)。 预定义的 typedef 指定范围为 2 到 9 的向量大小。 typedefs 是通过将大小的单位数形式附加到向量类型来定义的; 示例:rowvec3 等效于 rowvec::fixed<3>, 而 cx_rowvec4 等效于 cx_rowvec::fixed<4>

    rowvec::fixed(fill_form)
    
    • 1

    创建一个固定大小的行向量,并根据fill_form显式初始化元素

    rowvec::fixed(const ptr_aux_mem)
    
    • 1

    创建一个固定大小的行向量,其大小通过 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    另请参阅:

    element initialisation
    Mat class
    Col class
    
    • 1
    • 2
    • 3

    Cube

    cube

    cx_cube

    立方体(准三阶张量)的类,也称为“三维矩阵”

    数据存储为一组连续存储在内存中的切片(矩阵); 在每个切片中,元素以列优先顺序(即逐列)存储

    根多维数据集类是 Cube,其中 type 是以下项之一:
    floatdoublestd::complexstd::complexshortintlong 和无符号版本的 shortintlong

    为方便起见,定义了以下 typedef:

    cube	 = 	Cube
    dcube	 = 	Cube
    fcube	 = 	Cube
    cx_cube	 = 	Cube
    cx_dcube	 = 	Cube
    cx_fcube	 = 	Cube
    ucube	 = 	Cube
    icube	 = 	Cube
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在本文档中,为方便起见,使用了多维数据集类型; 可以使用其他类型来代替,例如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)	 	(用于从两个实立方体中构造一个复杂的立方体)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这些元素可以在构造过程中通过指定 fill_form 来显式初始化, 这是其中之一:

    fill::zeros	↦	将所有元素设置为 0
    fill::ones	↦	将所有元素设置为 1
    fill::randu	↦	将所有元素设置为 [0,1] 区间内均匀分布中的随机值
    fill::randn	↦	将所有元素设置为均值和单位方差为零的正态/高斯分布中的随机值
    fill::value(scalar)	↦	将所有元素设置为指定的标量
    fill::none	↦	不要初始化元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    警告:
    从Armadillo 10.5 开始,元素默认初始化为零
    在 Armadillo 10.4 及更早版本中,除非指定fill_form否则不会初始化元素; 即。如果不指定fill_form,元素可能包含垃圾值,包括 NaN

    每个多维数据集实例都会自动分配和释放内部存储器。 一旦实例超出范围,多维数据集实例使用的所有内部分配的内存都会自动释放。 例如,如果在函数中声明了 cube 的实例,它将在函数结束时自动销毁。 要在任何时候强制释放内存,请使用 .reset();请注意,在正常使用中,这不是必需的。

    高级构造函数:

    cube::fixed
    
    • 1

    创建一个固定大小的多维数据集,其大小通过模板参数指定。 多维数据集的内存在编译时保留。 这通常比动态内存分配更快,但之后无法(直接或间接)更改多维数据集的大小。

    cube(ptr_aux_mem, n_rows, n_cols, n_slices, copy_aux_mem = true, strict = false)
    
    • 1

    使用可写辅助(外部)存储器中的数据创建多维数据集,其中 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)
    
    • 1

    通过从只读辅助存储器复制数据来创建多维数据集, 其中 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 cube
    
    cube q = y + y;     // cube addition
    cube r = y % y;     // element-wise cube multiplication
    
    cube::fixed<4,5,6> f;
    f.ones();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    笔记:

    每个立方体切片都可以解释为一个矩阵,因此将 Mat 作为输入的函数通常也可以将立方体切片作为输入

    无法更改单个切片的大小。 例如,以下操作将不起作用:

    cube c(5,6,7);
    c.slice(0) = randu(10,20); // wrong size
    
    • 1
    • 2

    另请参阅:

    cube attributes
    accessing elements
    math & relational operators
    subcube views and slices
    saving & loading cubes
    element iterators
    field class
    Mat class
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    field

    用于在矩阵式或立方体式布局中存储任意对象的类

    有点类似于矩阵或立方体,但不是每个元素都是标量, 每个元素可以是向量、矩阵或立方体

    每个元素可以具有任意大小(例如,在矩阵字段中,每个矩阵可以具有唯一的大小)

    构造函数,其中 object_type 是另一个类,例如。vecmatstd::string 等:

    field()
    field(n_elem)
    field(n_rows, n_cols)
    field(n_rows, n_cols, n_slices)
    field(size(X))
    field(field)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    警告: 要存储一组相同大小的矩阵,Cube 类效率更高

    例子:

    mat A = randn(2,3);
    mat B = randn(4,5);
    
    field F(2,1);
    F(0,0) = A;
    F(1,0) = B; 
    
    F.print("F:");
    
    F.save("mat_field");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    另请参阅:

    field attributes
    subfield views
    saving / loading fields
    Cube class
    
    • 1
    • 2
    • 3
    • 4

    SpMat

    sp_mat

    sp_cx_mat

    稀疏矩阵的类;用于存储大型矩阵,其中大多数元素为零

    根稀疏矩阵类是 SpMat,其中 type 是以下项之一:
    floatdoublestd::complexstd::complexshortintlong 和 无符号版本的shortintlong

    为方便起见,定义了以下 typedef:

    sp_mat	 = 	SpMat
    sp_dmat	 = 	SpMat
    sp_fmat	 = 	SpMat
    sp_cx_mat	 = 	SpMat
    sp_cx_dmat	 = 	SpMat
    sp_cx_fmat	 = 	SpMat
    sp_umat	 = 	SpMat
    sp_imat	 = 	SpMat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在本文档中,为了方便起见,使用了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)	 	(用于从两个实数矩阵中构造一个复矩阵)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    默认情况下,所有元素都被视为零(即矩阵初始化为包含零)

    非零元素以压缩稀疏列 (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,locationsumat 类型的致密矩阵,大小为 2 x N,其中 N 是要插入的值的数量; 第 i 个元素的位置由位置矩阵的第 i 列的内容指定, 其中行位于 locations(0,i) 中,列位于 locations(1,i)

    对于形式 4,rowinduvec 类型的密集列向量,包含要插入的值的行索引, colptr 是 UVEC 类型的密集列向量(长度为 n_cols + 1),包含对应于新列开头的值的索引; 向量对应于压缩稀疏列格式使用的数组; 此表单可用于从其他 CSC 稀疏矩阵容器复制数据

    对于所有形式,values 是包含要插入的值的密集列向量; 它必须具有与稀疏矩阵相同的元素类型。 对于表单 1 和 2,values[i] 中的值将插入到位置矩阵的第 i 列指定的位置。

    对于形式 3,add_values 要么是 true 要么是 false;设置为 true 时,允许相同的位置,并添加相同位置的值

    构造矩阵的大小为 根据位置矩阵(表单 1)中的最大位置自动确定, 或 通过n_rowsn_cols手动指定(形式 2、3、4)

    如果sort_locations设置为 false,则假定位置矩阵包含已根据列主要排序排序的位置;除非您知道自己在做什么,否则不要将其设置为 false

    如果check_for_zeros设置为 false,则假定值向量不包含零值;除非您知道自己在做什么,否则不要将其设置为 false!

    以下操作和函数的子集可用于稀疏矩阵:
    基本算术运算(如加法和乘法)
    子矩阵视图:X.cols(vector_of_column_indices) 的大多数连续形式和非连续形式
    对角线视图
    保存和加载(使用 arma_binarycoord_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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    另请参阅:

    element access
    element iterators (稀疏矩阵)
    printing matrices
    Sparse Matrix in Wikipedia
    Mat class (稠密矩阵)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运算符: + − * % / == != <= >= < > && ||

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    另请参阅:

    approx_equal()
    pow()
    any()
    all()
    affmul()
    accu()
    as_scalar()
    find()
    .replace()
    .transform()
    .each_col() 和 .each_row() (应用于每列或每行的向量运算)
    其他元素函数(exp、log、sqrt、square、round 等)
    维基百科中的浮点运算
    MathWorld 中的浮点表示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    用友携YonSuite亮相云栖大会,全方位生态合作再提速
    闲谈工业企业全厂信息化规划
    (二)k8-集群创建
    iptables的使用
    STM32教程 使用硬件SPI和模拟SPI驱动W25Q64芯片
    GO语言从入门到实战-Go语言课程介绍
    云服务器租用4核16G配置价格表,阿里云和腾讯云费用价格对比
    【Linux】字节序理解
    解决eclipse中的Java文件,使用idea打开的乱码问题
    Windows OpenGL ES 图像阴影
  • 原文地址:https://blog.csdn.net/weixin_40948750/article/details/136491570