Armadillo
安装
Armadillo是一个具有Matlab风格的线性代数包。下载之后解压到任意文件夹,然后对VS工程进行设置。
- 菜单栏生成->配置管理器,将平台改为x64
- 右键项目名称->属性(快捷键Shift+F4),编辑VC++目录。将
..\armadillo-9.900.5\examples\lib_win64
这个文件夹的绝对路径添加到包含目录和库目录中。 - 点击C/C++->常规,将
..\armadillo-9.900.5\include
这个文件夹的绝对路径添加到附加包含目录中。 - 点击链接器->常规,将
\armadillo-9.900.5\examples\lib_win64
文件夹的绝对路径添加到附加库目录中。 - 选择链接器->输入,将lib_win64中的两个文件blas_win64_MT.lib和lapack_win64_MT.lib添加到附加依赖项中
- 配置完成后,将
\armadillo-9.900.5\examples\lib_win64
下的dll文件复制到新建项目的debug文件夹下。
入门案例
mat
格式是Armadillo中最基础的矩阵格式,其赋值方法如下代码所示。
#include <iostream>
#include <armadillo> //armadillo
using namespace std;
using namespace arma; //armadillo的命名空间
int main(){
mat A(2, 3); //可建立2行3列的矩阵
cout << A.n_rows << endl; // 输出为2
cout << A.n_cols << endl; // 输出为3
A(1,2)=15; //第1行第2个数赋值为15
A = 5.0; //将A变为1X1的矩阵,其值为5
A.set_size(4, 5); //重新设置矩阵的行列数
A.fill(5.0); //将A的所有值都置为5.0
A.print("A:");
system("pause");
return 0;
}
最后的A.print("A:");
语句得到$$
[ 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 5.0000 ] \begin{bmatrix} 5.0000&5.0000& 5.0000 &5.0000 & 5.0000\\ 5.0000& 5.0000& 5.0000 & 5.0000& 5.0000\\ 5.0000 & 5.0000 & 5.0000 &5.0000 & 5.0000\\ 5.0000 & 5.0000 &5.0000 &5.0000 &5.0000 \end{bmatrix} 5.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.00005.0000
直接赋值
此外,矩阵可直接赋值,每行元素用<<
间隔,每行结尾用endr
区分。对于已经建立的矩阵,可以非常方面地求行列式与逆矩阵,并提供了保存功能。案例如下
int main(){
mat A();
//为矩阵A赋值
A << 0.165300 << 0.454037 << 0.995795 << 0.124098 << endr
<< 0.688782 << 0.036549 << 0.552848 << 0.937664 << endr
<< 0.348740 << 0.479388 << 0.506228 << 0.145673 << endr
<< 0.148678 << 0.682258 << 0.571154 << 0.874724 << endr;
cout << det(A) << endl; //计算行列式
cout << inv(A) << endl; //计算逆矩阵
A.save("A.txt", raw_ascii); //存储矩阵
system("pause");
}
其结果为
0.227747 //此为矩阵行列式的值,下面是逆矩阵
-1.0136 0.7210 2.3596 -1.0220
-0.9098 -0.9106 1.8929 0.7899
1.6083 0.2419 -1.1112 -0.3025
-0.1682 0.4297 -1.1519 0.8983
请按任意键继续. . .
切片
int main(){
mat B;
B.load("A.txt"); //加载刚刚存储的矩阵
cout << B(span(0, 2), span(3, 4)) << endl;
cout << B(0, 3, size(3, 2)) << endl;//起始点为(0,3),尺寸为3X2
cout << B.row(0) << endl; //第0行
cout <<B.col(1) << endl; //第1列
}
常用函数
一些常用的函数如下表所示,其逻辑与Matlab/Octave是十分相似的,对于矩阵A
而言
表达式 | 功能 | Octave语法 |
---|---|---|
A.t() | 转置 | a’ |
det(A) | 行列式 | det(A) |
inv(A) | 逆矩阵 | inv(A)或A^(-1) |
max(A) | 按列取最大值 | max(A) |
max(A,1) | 按行取最大值 | max(A,1) |
max(max(A)) | 最大值 | max(max(A)) |
sum(A) | 按列求和 | sum(A) |
sum(A,1) | 按行求和 | sum(A,1) |
accu(A) | 求和 | sum(sum(A)) |
trace(A) | 求A的迹 | trace(A) |
其中粗体为与Matlab不同者。