前言

最近在用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_MTblas_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配置笔记的更多相关文章

  1. C++矩阵运算库推荐

    最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧.主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐. Armadillo:C++下的Matlab替代品 地址 ...

  2. Duanxx的Design abroad: C++矩阵运算库Eigen 概要

    一.概要 这两天想起来要做神经网络的作业了,要求用C++完毕神经网络的算法. 摆在面前的第一个问题就是,神经网络算法中大量用到了矩阵运算.可是C++不像matlab那样对矩阵运算有非常好的支持.本来准 ...

  3. c++矩阵运算库Eigen简介

    C++矩阵运算库Eigen介绍 C++中的矩阵运算库常用的有Armadillo,Eigen,OpenCV,ViennaCL,PETSc等.我自己在网上搜了一下不同运算库的特点,最后选择了Eigen.主 ...

  4. php +apache +mysql 配置笔记

    2013年11月5日 14:27:46 php +apache +mysql 配置笔记 mysql 正常安装 忽略. 1,配置笔记:安装apache 的成功标志是:安装完成之后,在浏览器输入http: ...

  5. Linux下Ganglia集群监控安装、配置笔记

    http://www.blogjava.net/henry14/archive/2011/12/17/ganglia.html 枪声依旧 Linux下Ganglia集群监控安装.配置笔记 Gangli ...

  6. CentOS6.5环境配置笔记

    CentOS6.5环境配置笔记 一.概述 服务器系统重装,配置应用运行环境 CentOS6.5 x64 二.修改密码 重新设置登录密码 $passwd 或 $passwd root 三.配置端口号及防 ...

  7. Elasticsearch之重要核心概念(cluster(集群)、shards(分配)、replicas(索引副本)、recovery(据恢复或叫数据重新分布)、gateway(es索引的持久化存储方式)、discovery.zen(es的自动发现节点机制机制)、Transport(内部节点或集群与客户端的交互方式)、settings(修改索引库默认配置)和mappings)

    Elasticsearch之重要核心概念如下: 1.cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.es的一个概念就是 ...

  8. Win8.1下FreeImage.lib库的配置和简单使用(转)

    转自http://www.codeweblog.com/win8-1下freeimage-lib库的配置和简单使用/ 首先,你可以从这里获取FreeImage的完整库文件(访问密码 9a5e). 配置 ...

  9. Bandwidthd+Postgresql数据库配置笔记

    Bandwidthd+Postgresql数据库配置笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/zjianbo/article/detai ...

随机推荐

  1. [Toolchain]arm-none-linux-gnueabin编译

    http://blog.sina.com.cn/s/blog_a000da9d0101436p.html

  2. git 服务器的搭建

    文章转载地址:http://www.linuxidc.com/Linux/2015-05/117502.htm 亲测可行,已经自己搭建一个正在使用中,搭建完成后,结合着pycharm +git,就能直 ...

  3. 响应式布局 Bootstrap(01)

    1.是什么?Bootstrap,来自 Twitter,是目前最受欢迎的前端框架,Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷 Boot ...

  4. (转)SVN 服务端、客户端安装及配置、导入导出项目

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  5. js json 与字符串 转换过程由于书写不统一规范引发的一个问题

    对于两个字符串: 字符串1:{title:{},tooltip:{trigger:"axis"},legend:{data:["新关注人数"]},calcula ...

  6. E:in-range伪类选择器与E:out-of-range伪类选择器

    E:in-range伪类选择器用来指定当元素的有效值被限定在一段范围之内(通常通过min属性值与max属性值来限定),且实际输入值在该范围内时使用的样式.E:out-of-range伪类选择器用来指定 ...

  7. C++使用VARIANT实现二维数组的操作

    C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...

  8. WinCE6.0多国语言软键盘

    N久以前写过一篇<WinCE下自定义的大软键盘>,这个自定义软键盘就是为RM905a+项目来做的.RM905a+的系统分辨率是640*480,WinCE原生键盘小的太小,大的又太大.所以就 ...

  9. ini 文件

    INI文件是一个无固定标准格式的配置文件.它以简单的文字与简单的结构组成,常常使用在视窗操作系统,或是其他操作系统上,许多程序也会采用INI文件做为设置程序之用.视窗操作系统后来以注册表的形式替换掉I ...

  10. CentOS6.5下安装apache2.2和PHP 5.5.28

    CentOS6.5下安装apache2.2 1. 准备程序 :httpd-2.2.27.tar.gz 下载地址:http://httpd.apache.org/download.cgi#apache2 ...