前言

最近在用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. 必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1

    在Windows Server 2008下直接安装SQL Server 2008时,会出现如下错误: 必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1 ...

  2. CSS基本语法

    这里主要介绍Bootstrap里用到的CSS语法,以便在源码分析时更容易理解和学习.Bootstrap的CSS组件的核心就是选择器的定义以及在各自优先级上的处理. 优先级 如何确定CSS的优先级,这里 ...

  3. 安装 python psutil 包

    yum install python-pip 下载 psutil https://pypi.python.org/pypi?:action=display&name=psutil#downlo ...

  4. [CF225C] Barcode (简单DAG上dp)

    题目链接:http://codeforces.com/problemset/problem/225/C 题目大意:给你一个矩阵,矩阵中只有#和.两种符号.现在我们希望能够得到一个新的矩阵,新的矩阵满足 ...

  5. 二模07day1解题报告

    T1.种树(tree) 有n棵树,各有高度,要求每棵树的高度都小于它到其他树的距离(可能种一起).求砍掉的总高度是多少. Ok,那么可以想到,只要满足每棵树和最近的树满足条件就可以保证和其他树满足了. ...

  6. c# winform TreeView NODE(节点) 重命名或获取节点修改后的值

    在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...

  7. 建议Javascript以后都用严格模式

    建议以后都在js文件的头部加上 "use strict"; 现在主流的浏览器都支持,不支持的浏览器也会忽略掉. 可以使我们写的更规范,可控: 有些错误编译的时候就会出现,方便排错:

  8. delphi ftBlob二进制字段读取存储

    aStream:TMemoryStream; 保存到字段 qrypub.ParamByName('Data').LoadFromStream(aStream, ftBlob); 从字段读取到mem里 ...

  9. Spark Idea Maven 开发环境搭建

    一.安装jdk jdk版本最好是1.7以上,设置好环境变量,安装过程,略. 二.安装Maven 我选择的Maven版本是3.3.3,安装过程,略. 编辑Maven安装目录conf/settings.x ...

  10. display:inline-block

    /* inline为行内元素不自动换行,不占用文档流,也就是说你在这个后面写一个元素这个元素会并排显示.block为块元素,单独占一行文档,并可以给这个块元素添加宽高背景颜色.而inline-bloc ...