在C++中数值计算需要对矩阵进行操作,今天就介绍一款类似Matlab的矩阵运算库Armadillo。真的是太美了。下面介绍Ubuntu14.04下的安装及其使用。
1 安装
按照源码中的README.txt,安装步骤分别如下:
- 需要有g++编译器,这就不用说了。
- 需要安装cmake,可执行sudo apt-get install cmake。
- 推荐安装 OpenBLAS,LAPACK,SuperLU,ARPACK;分别执行sudo apt-get install libopenblas-dev,sudo apt-get install liblapacke-dev,sudo apt-get install libsuperlu3-dev,sudo apt-get install libarpack2-dev,也可以从源码编译安装。
- 执行编译
- cmake .
- make
- 安装sudo make install [DESTDIR=my_usr_dir]
- 系统环境变量配置,将lib文件和include文件加入LD_LIBRARY_PATH和CPLUSE_INCLUDE_PATH。
2 开撸实例
2.1 基本的数据类型
- 需要包含头文件和命名空间#include ;using namespace arma;
- vec(n_elem, fill_type)声明一个n_elem个元素的列向量,向量的初值由fill_type决定。
- rowvec(n_elem, fill_type)声明行向量,与列向量类似。
- mat(n_rows, n_cols, fill_type)声明一个n_rows行n_cols列的矩阵,并用fill_type类型数据填充,fill_type可以是全0数据,全1数据,单位阵数据,[0,1]均匀分布的数据,标准高斯分布的数据,也可以不设置初值。
- cube(n_rows, n_cols, n_slices, fill_type)声明3维矩阵,与mat类似。
- field(n_rows, n_cols),field(n_rows, n_cols, n_slices)存储object_type类型的对象数组。
2.2 数组的成员函数和变量
- n_rows:数组的行数
- n_cols:数组的列数
- n_elem:数组中所有单元的个数
- n_slices:3D矩阵的分片数
- n_nonzero:SpMat中的非零元素个数
2.3 基本的矩阵操作
- 访问单个元素:(n),.at(n)访问向量的第n个元素,(i,j),.at(i,j)访问二维数组的第i,j个元素,(i,j,k),.at(i,j,k)访问3维数组的第i,j,k个元素。
- 访问矩阵分片
- 访问连续分片
- X.col( col_number )取X的第col_number列
- X.row( row_number )取X的第row_number行
- X.cols( first_col, last_col )取X的第first_col到last_col列的数据
- X.rows( first_row, last_row )取X的第first_row到last_row行的数据
- X.submat( first_row, first_col, last_row, last_col )取X的第first_row到last_row行,第first_col到last_col列的数据
- 访问不连续分片数据
- X( vector_of_indices ),X.elem( vector_of_indices )访问vector_of_indices中存储的索引位置的X元素
- X.cols( vector_of_column_indices )访问v你ector_of_column_indices存储的列所以
- X.rows( vector_of_row_indices )
- X.submat( vector_of_row_indices, vector_of_column_indices )
- X( vector_of_row_indices, vector_of_column_indices )
- 访问连续分片
2.4 数学计算
矩阵计算中常用的矩阵求逆,矩阵求伪逆,QR分解等可用inv,pinv,lu函数。还有其它各种函数方法,相见主页http://arma.sourceforge.net/docs.html#dot