1. armadillo说明
armadillo是目前使用比较广的C++矩阵运算库之一,相当于Matlab的C++替代库。许多Matlab的矩阵操作函数都可以找到对应,这对习惯了Matlab的人来说实在是非常方便,另外如果要将Matlab下做研究的代码改写成C++,使用Armadillo也会很方便。
armadillo特性如下:
-
Armadillo是一种用于C ++语言的高质量线性代数库(矩阵数学),旨在在速度和易用性之间取得良好的平衡
-
提供类似于Matlab的高级语法和功能
-
可用于直接在C ++中进行算法开发,或将研究代码快速转换为生产环境
-
为向量,矩阵和立方体提供有效的类(一阶,二阶和三阶张量);支持密集和稀疏矩阵
-
支持整数,浮点数和复数
-
复杂的表达式评估器(基于模板元编程)可自动组合多个操作以提高速度和效率
-
通过与LAPACK或其高性能替代产品之一(例如MKL或OpenBLAS)集成,可以提供各种矩阵分解(本征,SVD,QR等)
-
可以自动使用OpenMP多线程(并行化)来加快计算量大的操作
-
根据许可许可提供,对开放源代码和专有(封闭源)软件均有用
-
可用于机器学习,模式识别,计算机视觉,信号处理,生物信息学,统计,金融等
2. Ubuntu16.04安装armadillo库
1. 安装依赖库
sudo apt-get update
sudo apt-get install liblapack-dev
sudo apt-get install libblas-dev
sudo apt-get install libboost-dev
2. 安装armadillo
sudo apt-get install libarmadillo-dev
3. 测试程序
// test.cpp
#include <iostream>
#include <armadillo>
using namespace std;
using namespace arma;
int main(int argc, char **argv)
{
mat A = randu(4, 5);
mat B = randu(4, 5);
cout << A*trans(B) << endl;
return 0;
}
4. 编译
g++ test.cpp -std=c++11 -larmadillo -o test
5. 运行及结果
./test
//结果如下:
0.8635 0.6455 1.2309 0.3664
0.9823 0.7291 1.3008 0.7792
1.0882 1.0004 1.6399 0.6935
1.4101 0.9859 2.0146 0.7092
6. 问题记录
- 编译问题
安照上述步骤编译test.cpp时报错,错误如下:
//usr/lib/libblas.so.3: undefined reference to `gotoblas'
collect2: error: ld returned 1 exit status
这是因为在我的系统中安装有多个libblas和liblapack库,在编译时如果两者对应的版本不匹配就会出现上述错误,可以在atlas下选择相同的库。
如:
sudo update-alternatives --config libblas.so.3
我这里选择1号版本:
There are 2 choices for the alternative libblas.so.3 (providing /usr/lib/libblas.so.3).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/openblas-base/libblas.so.3 40 auto mode
1 /usr/lib/libblas/libblas.so.3 10 manual mode
2 /usr/lib/openblas-base/libblas.so.3 40 manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/libblas/libblas.so.3 to provide /usr/lib/libblas.so.3 (libblas.so.3) in manual mode
同理选择对应的liblapack.so.3文件
sudo update-alternatives --config liblapack.so.3
结果如下:
There are 2 choices for the alternative liblapack.so.3 (providing /usr/lib/liblapack.so.3).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/openblas-base/liblapack.so.3 40 auto mode
1 /usr/lib/lapack/liblapack.so.3 10 manual mode
2 /usr/lib/openblas-base/liblapack.so.3 40 manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/lapack/liblapack.so.3 to provide /usr/lib/liblapack.so.3 (liblapack.so.3) in manual mode