在学习数据挖掘和机器学习的时候,很多时候,用矩阵求解的方法是很简便的,但是C++要完成矩阵运算,自己写实现显然是工程浩大的。因此我们常常借助第三方函数库来解决问题。
找了好几天基本线性代数的库,看到有人推荐说Armadillo,看他给的安装教程也挺简单的,就尝试了一下。结果,弄了一整天才能够正常运行。罪魁祸首是编译器的编译环境设置问题。
下面就具体说一下x64环境下,Armadillo + Vs2010的安装和配置方法。
1、 下载Armadillo(官网:http://arma.sourceforge.net/),得到下面的包;
2、 将其解压,得到如下目录:
3、 用文本编辑器打开include/armadillo_bits/config.hpp,将下图中红框里的两句话去掉前面的注释符。去掉注释表示使用BLAS和LAPACK,据说能提高速度。
4、 打开VS2010,新建一个win32的工程;
5、 右击新建的项目,选择属性,出来下面的东西:
6、 选择VC++目录一项,将包含目录设置为你解压后,include文件夹的路径(记住,一定是知道include这一级,我就多进入了一级目录,错了。);
将库目录设置为解压后example里的lib文件夹;设置后如下:
7、 接着选C/C++里的常规项,设置附加包含目录,同样为上述的include文件夹路径:
8、 选择链接器/常规,将附加库目录设置为上述的lib文件夹路径:
9、 选择链接器/输入,将附加依赖项里添加lib文件夹里的两个lib文件:
10、 OK,点击确定,在cpp里写测试代码试一下:
#include
#include
using namespace arma;
int main()
{
arma::mat A = arma::randu(1000, 1000) * 10;
arma::mat B = arma::randu(1000, 1000) * 10;
arma::mat C = A % B;
//A.print("A = \n");
cout << endl << A(3,3) << endl;
A(3,3) = 0.111111;
cout << endl << A(3,3) << endl;
mat D;
double arr[10]={1,2,3,4,5,6,7,8,9,10};
D << arr[0] << arr[1] << arr[2] << endr
<< arr[3] << arr[4] << arr[5] << endr
<< arr[6] << arr[7] << arr[8] << endr;
mat E = D.i();
E.print();
A.print("A = \n");
B.print("B = \n");
C.print("A .* B = \n");
system("pause");
return 0;
}
11、 是不是惊喜第发现,可以运行了??!!其实你错了,你在换个矩阵乘法,矩阵求逆测试一下!看到了吧!傻眼!
12、 上网狂搜各种教程和问题,都没找到解决办法。后来有个人的帖子提醒了我,说32位的lib和64位的lib是有区别的,混用可能会出这样的链接问题,因此,将编译器的编译环境改为x64的。
13、 选择生成/配置管理器:
14、 在出来的框框里,在平台那里新建一个x64的,图中为已经建了x64的,所以有x64的选项。
15、 是不是觉得这下子可以用了呢?编译一下,哟西,编译成功了,运行呢?提示缺少dll文件。哈哈,别急,还有装个MinGW。装完之后在安装目录的bin文件夹里就可以找到所需的dll文件。将其拷贝到编译出来的exe所在的文件夹里。
16、 最后还差一步,就是把上述Armadillo的lib文件夹里的两个dll文件也拷到exe所在的文件夹里,OK,可以了。
【】
其实,在这里(http://icl.cs.utk.edu/lapack-for-windows/lapack/#libraries_mingw)已经把运行LAPACK的要求写得很清楚了,一步步弄完就ok了。
其实问题的关键是,你下载到的lib是32位的还是64位的,根据这个来调整一下编译器的编译环境就可以了。