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>
using namespace std;
using namespace arma;
int main(){
mat A(2, 3);
cout << A.n_rows << endl;
cout << A.n_cols << endl;
A(1,2)=15;
A = 5.0;
A.set_size(4, 5);
A.fill(5.0);
A.print("A:");
system("pause");
return 0;
}
最后的A.print("A:"); 语句得到
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
请按任意键继续. . .
直接赋值
此外,矩阵可直接赋值,每行元素用<< 间隔,每行结尾用endr 区分。对于已经建立的矩阵,可以非常方面地求行列式与逆矩阵,并提供了保存功能。案例如下
int main(){
mat 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;
cout << B.row(0) << endl;
cout <<B.col(1) << endl;
}
常用函数
一些常用的函数如下表所示,其逻辑与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不同者。
|