C++矩阵运算库armadillo配置笔记
前言
最近在用C++实现神经网络模型,优化算法需要用到矩阵操作,一开始我用的是boost的ublas库,但用着用着感觉很不习惯,接口不够友好。于是上网搜索矩阵运算哪家强,大神们都推荐armadillo。一方面本着群众的眼光是雪亮的这一原则,另一方面也想尝尝鲜(听说和Matlab很类似,用着非常爽),就折腾了一下。
armadillo是一个开源的C++线性代数计算函数库,目的是在效率和易用性之间取个折中。它的API风格类似Matlab,因此会用matlab的话,用起它来将十分得心应手。这个库其实是对底层的矩阵运算库(例如BLAS,LAPACK)的封装,也就是说,这个库本身的计算能力其实不强,但是这个库可以配合开源的底层库来使用,例如最基本的BLAS+LAPACK或者改进后的OpenBLAS,ACML还有强大的MKL。
在Eclipse中配置armadillo
1.打开"C/C++ General" 标签下的"Paths and Symbols",在Includes菜单下的language框里选择GNU C++,点击右边的add按钮,将D:\armadillo-6.300.2\include加入路径

2.在Libraries标签下加入BLAS和LAPACK的路径 D:\armadillo-6.300.2\examples\lib_win64

3.在C/C++ Build->Settings下,选择MinGW C++ Linker->Libraries,点击add按钮输入lapack_win64_MT和blas_win64_MT

到D:\armadillo-6.300.2\include\armadillo_bits下,找到config.hpp,取消以下两行的注释
#define ARMA_USE_LAPACK
#define ARMA_USE_BLAS
这里有一个问题,我写了一个测试程序,矩阵点乘、加减法能正常输出,但是矩阵乘积、行列式、求逆就没有输出,估计是哪里崩溃了。 接着我想着换别的Blas库会不会就行了呢,于是参照网上的方法,到http://icl.cs.utk.edu/lapack-for-windows/clapack/index.html 下载blas.lib,libf2c.lib,lapack.lib三个库放到lib目录(我在D:\armadillo-6.300.2下新建了一个lib目录),并将它们按照刚才的步骤加入到PATH。编译发生了错误:
ld.exe: skipping incompatible D:\armadillo-6.300.2\lib/lapack.lib when searching for -llapack
skipping incompatible D:\armadillo-6.300.2\lib/lapack.lib when searching for -llapack
skipping incompatible D:\armadillo-6.300.2\lib\lapack.lib when searching for -llapack
StackOverFlow上的说法是,这是因为用64位编译器和32位的lib文件链接导致的。后面又陆陆续续试了很多办法,都没解决程序崩溃的问题,不想浪费时间就放弃了。
armadillo+openblas配置
网上看了一些教程,写的很复杂,经过一番折腾,发现在windows下配置不用那么费劲。首先我们要去OpenBlas官网下载一个最新版的openblas库,64位系统下载OpenBLAS-v0.2.15-Win64-int32.zip,32位系统下载OpenBLAS-v0.2.15-Win32.zip。下载完后解压,接着打开"C/C++ General" 标签下的"Paths and Symbols",在Library Path框里点击add,加入Openblas的lib目录路径,同时把libopenblas.dll放到C:/Windows/System32下(或者可执行文件所在的目录),然后在C/C++ Build->Settings下,选择MinGW C++ Linker->Libraries,点击add按钮输入openblas就完成配置了。
接下来我们写一个程序来测试一下:
#include <iostream>
#include <armadillo>
using namespace std;
using namespace arma;
int main() {
mat A = randu<mat>(5,10);
mat C = randu<mat>(10,5);
mat U = A * C;
U.print("U:");
mat V = inv(U);
V.print("V:");
double D = det(U);
cout<<"det(U)="<<D<<endl;
return 0;
}

C++矩阵运算库armadillo配置笔记的更多相关文章
- C++矩阵运算库推荐
最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧.主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐. Armadillo:C++下的Matlab替代品 地址 ...
- Duanxx的Design abroad: C++矩阵运算库Eigen 概要
一.概要 这两天想起来要做神经网络的作业了,要求用C++完毕神经网络的算法. 摆在面前的第一个问题就是,神经网络算法中大量用到了矩阵运算.可是C++不像matlab那样对矩阵运算有非常好的支持.本来准 ...
- c++矩阵运算库Eigen简介
C++矩阵运算库Eigen介绍 C++中的矩阵运算库常用的有Armadillo,Eigen,OpenCV,ViennaCL,PETSc等.我自己在网上搜了一下不同运算库的特点,最后选择了Eigen.主 ...
- php +apache +mysql 配置笔记
2013年11月5日 14:27:46 php +apache +mysql 配置笔记 mysql 正常安装 忽略. 1,配置笔记:安装apache 的成功标志是:安装完成之后,在浏览器输入http: ...
- Linux下Ganglia集群监控安装、配置笔记
http://www.blogjava.net/henry14/archive/2011/12/17/ganglia.html 枪声依旧 Linux下Ganglia集群监控安装.配置笔记 Gangli ...
- CentOS6.5环境配置笔记
CentOS6.5环境配置笔记 一.概述 服务器系统重装,配置应用运行环境 CentOS6.5 x64 二.修改密码 重新设置登录密码 $passwd 或 $passwd root 三.配置端口号及防 ...
- Elasticsearch之重要核心概念(cluster(集群)、shards(分配)、replicas(索引副本)、recovery(据恢复或叫数据重新分布)、gateway(es索引的持久化存储方式)、discovery.zen(es的自动发现节点机制机制)、Transport(内部节点或集群与客户端的交互方式)、settings(修改索引库默认配置)和mappings)
Elasticsearch之重要核心概念如下: 1.cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.es的一个概念就是 ...
- Win8.1下FreeImage.lib库的配置和简单使用(转)
转自http://www.codeweblog.com/win8-1下freeimage-lib库的配置和简单使用/ 首先,你可以从这里获取FreeImage的完整库文件(访问密码 9a5e). 配置 ...
- Bandwidthd+Postgresql数据库配置笔记
Bandwidthd+Postgresql数据库配置笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/zjianbo/article/detai ...
随机推荐
- Keepalived安装使用详解
简介 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker. 但是它一般不会单独出现, ...
- 【学】CSS3基础实例2 - box-shadow, border-radius 圆形图标以及内部旋转
首先要说一下,transition属性ie9是不支持的,从ie10才开始支持 例子是当鼠标移上div后,它会旋转180度. 要点: 用圆角制作圆形盒子,border-radius设置成50%: 用bo ...
- itextSharp 附pdf文件解析
一.PdfObject: pdf对象 ,有9种,对象是按照对象内涵来分的,如果按照对象的使用规则来说,对象又分为间接对象和直接对象.间接对象是PDF中最常用的对象,如前面对象集合里面的,所有对象都是间 ...
- [POJ 1988] Cube Stacking (带值的并查集)
题目链接:http://poj.org/problem?id=1988 题目大意:给你N个方块,编号从1到N,有两种操作,第一种是M(x,y),意思是将x所在的堆放到y所在的堆上面. 第二种是C(x) ...
- 如何利用tomcat和cas实现单点登录(2):配置cas数据库验证和cas客户端配置
接(1),上一篇主要讲述了tomcat和cas server端的部署. 接下来主要还有两个步骤. 注意:为了开启两个tomcat,要把直接配置的tomcat的环境变量取消!!!!!!!!!! 客户端配 ...
- [转载:]Fortran 二进制文件读写
一些朋友总是咨询关于二进制文件的读写和转化.这里就我自己的理解说一说. 一).一般问题 二进制文件与我们通常使用的文本文件储存方式有根本的不同.这样的不同很难用言语表达,自己亲自看一看,理解起来会容易 ...
- Linux kill 杀死指定进程
一 杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/php /var/www/html/r ...
- JavaScript 对象 之创建对象 学习笔记
假设我们有这样的一个需求:记录一个人的 名字和年龄,然后有个方法可以显示这个人的名字和年龄. 按照普通的方法,我们的代码应该是这样的: var person1 = new Object() , per ...
- VBS使用Scripting.Dictionary字典对象
Scripting.Dictionary是个很有用的组件,其创建了类似于Key索引对应Value值的字典对象,并且在其内部提供了快速索引访问的机制,可以让我们通过Key直接索引到指定的Value,比遍 ...
- B-F 字符串匹配算法
Brute-Froce 算法是串的匹配模式算法中的一种其匹配方式如下: 1.设有字符串 a ,b;a为主串,在 a 中查找 b 串的位置 2.匹配方式如下: 2.1: 分别从 a,b串的第一个元素开始 ...