C++下的Matlab的替代工具Armadillo C++ linear algebra library

Amradillo C++线性代数库:http://arma.sourceforge.net/

 

Amradillo的名字来自于"犰狳"(qiúyú) ,又称“铠鼠”(kǎi shǔ), 一种浑身鳞甲的小动物[1],与食蚁兽和树懒有近亲关系,用盔甲似的骨质甲保护自己, 广布美国南部和南美,覆盖接合条带或角质骨板,能蜷缩成圆球以保护全身[2], Amradillo  C++线性代数库的Logo标志就是用的这种动物。Armadillo是一个C++开发的线性代数库,里面的矩阵运算功能非常给力,其函数兼顾了效率和易用性,函数接口和Matlab非常相似,该工具库支持基于Linux的操作系统、macOS系统和Windows系统,可以在机器学习、模式识别、计算机视觉、统计学和经济学中应用[3],工具库下载、学习访问官方网站http://arma.sourceforge.net/,最新版本(armadillo-7.800.3)提供的是64 bit Windows 7 with Visual C++2012,而我们使用的较低版本(armadillo-3.4.0)的测试,因为我们使用的32位的编译版本,这里我们也提供了较低版本的下载http://distfiles.macports.org/armadillo/(armadillo-4.**及以后的版本为x64编译版本,而armadillo-3.920.2版本之前的为win32编译版本),每个版本的函数更新情况可参考http://arma.sourceforge.net/docs.html中的“History ofAPI additions”部分,前述所有版本的armadilloC++库也可到我们的百度云盘下载https://pan.baidu.com/s/1hsGlH4o 密码:kr4v。

Armadillo C++ linear algebra library的使用方法可参考官方网站给出的API Documentation for Armadillo 8.300网页说明、安装包中的README.txt文件和对应的模板使用说明文件Armadillo:a template-based C++ library for linear algebra. Journal of Open SourceSoftware, Vol. 1, pp. 26, 2016. 如果在研究和软件中使用了该工具也需引用上述论文。下面我们以VS2012为例,介绍Armadillo的配置。

1 下载armadillo-3.4.0:https://pan.baidu.com/s/1hsGlH4o密码:kr4v,进行解压缩。

2 解压缩Armadillo后,在vs环境中把D:\armadillo-3.4.0\include目录添加到包含目录中,然后在写代码是加上#include<armadillo>就可以了。

3 添加库文件目录D:\armadillo-3.4.0\examples\lib_win32到库文件中。

4 打开VS 2008,创建一个Win32控制台程序,项目名为Test;

选择解决方案里的Test项目,点击鼠标右键,选择Properties,选择Linker中Input(调试目录)。在Additional Dependencies 中添加如下文件名:

   blas_win32_MT.lib

   lapack_win32_MT.lib

至此,配置完成。(如上述配置后,下述程序仍存在问题,建议下载下载blas.lib,libf2c.lib,lapack.lib三个库,下载地址http://icl.cs.utk.edu/lapack-for-windows/clapack/index.html#librarieshttps://pan.baidu.com/s/1hsGlH4o密码:kr4v, 代替blas_win32_MT.lib和lapack_win32_MT.lib进行测试[4,5])

如上配置完成后,可运行如下代码测试(代码从官网http://arma.sourceforge.net/docs.html#example_prog下载,注意需要添加的头文件和域名空间,应该该工具包中也包含了Mat矩阵类的定义,当该工具包与OpenCV同时使用时,注意区分,一般在使用Mat类时时候需要添加父类名,如cv::Mat或arma::Mat等):

#include <iostream>
#include <armadillo>
using namespace std;
using namespace arma;

int main()
  {
arma::mat A = arma::randu<arma::mat>(4,5);
    arma::mat B = arma::randu<arma::mat>(4,5);
    cout <<"A: "<<endl<< A<< endl;
    cout <<"B: "<<endl<< B<< endl;
    cout <<"A%B: "<<endl<< A%B<< endl;  
    return 0;
  }

运行结果:



参考资料

[1] http://blog.csdn.net/visionhack/article/details/46580779

[2] https://baike.baidu.com/item/%E7%8A%B0%E7%8B%B3/522688?fr=aladdin

[3] http://arma.sourceforge.net/

[4] http://blog.csdn.net/computerme/article/details/44344757

[5] http://blog.csdn.net/houston11235/article/details/8266646



猜你喜欢

转载自blog.csdn.net/zhouxianen1987/article/details/79003411