Eigen+suitesparse for windows 安装

Eigen是著名的C++矩阵运算库,提供了许多矩阵运算的接口,主要包括两大部分,一部分是稠密矩阵,另一部分是稀疏矩阵。Eigen以源码形式提供给大家,用的时候,只要将源码包含在项目的包含路径上,具体安装和使用方法,可以参考如下链接:

《C++矩阵处理工具——Eigen》,《Eigen初步1:初步体验Eigen库》。

这次我们重点讲解一下如何安装suitesparse库。

SuiteSparse是世界上最优秀的稀疏矩阵处理工程之一。SuiteSparse是一组C、Fortran和MATLAB函数集,用来生成空间稀疏矩阵数据。在SuiteSparse中几何多种稀疏矩阵的处理方法,包括矩阵的LU分解,QR分解,Cholesky分解,提供了解非线性方程组、实现最小二乘法等多种函数代码。

SuitSparse包含了众多的依赖库,例如:blas库、lapack库、cholmod库等,所以安装很复杂。不过值得庆幸的是,国外早有大牛已经实现了在windows,linux或者mac等所平台上的cmake脚本,具体参考Github项目<<suitesparse-metis-for-windows>>

 打开Github,会发现作者已经写了详细的安装流程,不过经过我亲测,还是有很多的陷阱。所以我将一步步地将所有的步骤给大家讲清楚,希望大家也能将自己学习历程中一些重要的知识分享出来,共建我们的开源社区。

先说一下我的配置:

    Windows 7 SP1, Visual studio 2008, cmake  2.8.

下面正式开始:

1. 安装Cmake

2.  下载或克隆Gthub上最新的项目版本,本版本为v1.3.0,然后解压到某个本地文件下,我们暂称这个路径为SP_ROOT,我这里是F:\suitsparse\suitesparse-metis-vs2008

我的如图所示:

   


这里注意:我们看到Gtihub上建议我们分别下载 SuiteSparse-X.Y.Z.tar.gz和 metis-X.Y.Z.tar.gz.(建议metis版本在5以下,比如metis-4.0.3,或者不要覆盖它),然后覆盖它原来所含的源代码。这里我觉得有点矛盾,因为我们打开https://github.com/jlblancoc/suitesparse-metis-for-windows/releases,就会看到v1.3.0的更新说明:

  • For the convenience of users, SuiteSparse+METIS souces are now also bundled in this package.
  • Support for CUDA builds (Enable WITH_CUDA)
所以根本没有必要下载上面两个文件,用它的就可以了。当然了,你重新下载两个文件,并覆盖原来的文件也是可行的。只要你按照它的说明去做即可。(再说一遍,最好不要覆盖这两个文件)

3.  打开 SP_ROOT/metis/CMakeLists.txt,在行project(METIS)后面加上命令 cmake_policy(SET CMP0022 NEW),

即:

cmake_minimum_required(VERSION 2.8)
project(METIS)
cmake_policy(SET CMP0022 NEW)
set(GKLIB_PATH "GKlib" CACHE PATH "path to GKlib")
set(SHARED FALSE CACHE BOOL "build a shared library")if(MSVC)set(METIS_INSTALL FALSE)
else()set(METIS_INSTALL TRUE)
endif()# Configure libmetis library.
if(SHARED)set(METIS_LIBRARY_TYPE SHARED)
else()set(METIS_LIBRARY_TYPE STATIC)
endif(SHARED)include(${GKLIB_PATH}/GKlibSystem.cmake)
# Add include directories.
include_directories(${GKLIB_PATH})
include_directories(include)
# Recursively look for CMakeLists.txt in subdirs.
add_subdirectory("include")
add_subdirectory("libmetis")
add_subdirectory("programs")
另外,如果你要使用CUDA,注意版本,具体见图:


4.  运行 CMake (cmake-gui),

然后:

  •    设置"Source code"为SP_ROOT
  •  设置"Build" 路径为任何空的路径,一般SP_ROOT/build
  •   "Configure"。
  •    然后你会发现有很多红的地方,你可以点击它们,再"Configure",尤其注意的是为了避免一些编译器中关于复数可能会出      错,HAVE_COMPLEX 被关闭。(但是经过我在平台上再三测试,你最好不要去勾,否则很容易在后面的编译阶段发生错误.)
  •  按 "Generate" 
如图:
5.编译和安装
Visual Studio,打开SuiteSparseProject.sln,并且建立Debug 和Release两种模式下的INSTALL 工程(设为启动项目)。


可能会出现很多的警告,不过一切都是OK的。
6.注意 SuiteSparseConfig.cmake应该位于install路径下,它将用于你的项目正确地连接到SuiteSparse
如图即为cmake的结果:


这样的话,就安装好了。我们接下来,就可以使用了。我们是在Eigen中使用这个库的,因为Eigen已经封装了它的接口。

举例:

#include <iostream>
#include "Eigen/Eigen"
#include "Eigen/SPQRSupport"
using namespace Eigen ;
int main ( ) {SparseMatrix < double > A ( 4 , 4 ) ;std :: vector < Triplet < double > > triplets ;// 初始化非零元素int r [ 3 ] = { 0 , 1 , 2 } ;int c [ 3 ] = { 1 , 2 , 2 } ;double val [ 3 ] = { 6.1 , 7.2 , 8.3 } ;for ( int i = 0 ; i < 3 ; ++ i )triplets . push_back( Triplet < double >(r [ i ] , c [ i ] , val [ i ]) ) ;// 初始化稀疏矩阵A . setFromTriplets ( triplets . begin ( ) , triplets . end ( ) ) ;std :: cout << "A = \n" << A << std :: endl ;// 一个QR分解的实例SPQR < SparseMatrix < double > > qr ;// 计算分解qr . compute ( A ) ;// 求一个A x = bVector4d b ( 1 , 2 , 3 , 4 ) ;Vector4d x = qr . solve ( b ) ;std :: cout << "x = \n" << x ;std :: cout << "A x = \n" << A * x ;return 0 ;
}

具体可参考:< Eigen 3.2稀疏矩阵入门>。

使用方法:

 安装好Eigen,将源程序路径加入vs2008的C++包含路径中,如图:



然后加入刚才编译的SuiteSparse库的相关文件。见图:


在项目-》属性-》C/c++ -》常规 -》附加包含目录中,加入SP_ROOT\build\install\include和SP_ROOT\build\install\include\suitesparse

链接器-》常规-》附加库目录,加入SP_ROOT\build\install\lib, SP_ROOT\build\install\lib\lapack_blas_windows

,SP_ROOT\build\install\lib64,SP_ROOT\build\lib\Debug

如图:


链接器-》输入-》附加依赖项,加入:

debug模式下:

libamdd.lib
libbtfd.lib
libcamdd.lib
libccolamdd.lib
libcholmodd.lib
libcolamdd.lib
libcxsparsed.lib
libklud.lib
libldld.lib
libspqrd.lib
libumfpackd.lib
suitesparseconfigd.lib
libblas.lib
liblapack.lib
metisd.lib

注意以上为debug模式下,Release模式下同理加入相对的lib。

Release模式下:

libamd.lib

libbtf.lib

libcamd.lib

libccolamd.lib

libcholmod.lib

libcolamd.lib

libcxsparse.lib

libklu.lib

libldl.lib

libspqr.lib

metis.lib

suitesparseconfig.lib

libblas.lib

liblapack.lib


最后在生成的debug文件下加入如下dll,

libblas.dll

libgcc_s_dw2-1.dll

libgfortran-3.dll

liblapack.dll

libquadmath-0.dll

可以在SP_ROOT\build\install\lib\lapack_blas_windows中找到,复制即可。

这样就可以运行了,结果为:



附:
我编译的库:

  • vs2008: http://pan.baidu.com/s/1bnme4Rd
  • vs2010:   http://pan.baidu.com/s/1dDr0bj7
  • vs2008测试例子:http://pan.baidu.com/s/1jGCU6lK
  • vs2010测试例子:http://pan.baidu.com/s/1qWL5MW0


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件盘控制的问题

2019独角兽企业重金招聘Python工程师标准>>> 在全屏模式或者是沉寝室标题栏 方案一&#xff1a;全屏模式 1.软键盘被EditText遮挡住了&#xff0c;如果说EditText被嵌套在有滑动的视图中,采取的方式是: activity中设置此属性 android:windowSoftInputMode"…

求二叉树的深度和宽度

// 求二叉树的深度和宽度.cpp : 定义控制台应用程序的入口点。 <pre name"code" class"cpp">#include <iostream> #include <queue> using namespace std;struct BTNode {char m_value;BTNode *m_left;BTNode *m_right; };//先序创建二叉…

zabbix自动发现监控磁盘(iops和读写量)

2019独角兽企业重金招聘Python工程师标准>>> 对于磁盘有个iops的概念比较奇怪&#xff0c;想监控起来看下&#xff0c;利用zabbix的自动发现把每个磁盘的iops监控起来&#xff0c;思路&#xff1a;自动发现所有的磁盘&#xff0c;然后监控各个磁盘的iops。效果如下图…

matlab内置函数fitgeotrans与transformPointsForward解析

最近研究3000fps的实现&#xff0c;看了网上给的一个matlab代码&#xff0c;里面有提到init_shape到mean_shape的对齐&#xff0c;里面使用了fitgeotrans和transformPointsForward两个函数。于是参考matlab help研究了一下这两个函数. fitgeotrans函数 语法: tform fitgeotr…

【电脑使用经验】怎么查看无线网络中电脑的IP地址?

1、 2、 3、 4、 5、 转载于:https://www.cnblogs.com/happykoukou/p/4437111.html

win8硬盘安装Ubuntu14.04双系统參考教程

硬盘安装&#xff0c;无需光盘、U盘。win8为主。Ubuntu14.04为辅。可将Windows或Ubuntu设置为开机默认启动项。在Ubuntu下可查看、操作Windows系统下的文件&#xff1b;适用于安装和14.04版本号相近的Ubuntu系统。假设以上所述正是你所须要的。那么这可能是一篇您值得參考的教程…

散列表查找失败平均查找长度_Python数据结构与算法56:排序与查找:冲突解决方案...

注&#xff1a;本文如涉及到代码&#xff0c;均经过Python 3.7实际运行检验&#xff0c;保证其严谨性。本文阅读时间约为6分钟。前面说过&#xff0c;如果两个数据项被散列映射到同一个槽&#xff0c;需要一个系统化的方法在散列表中保存第二个数据项&#xff0c;这个过程被称为…

Face Alignment by 3000 FPS系列学习总结(一)

广播&#xff1a; 如今的opencv已经提供了LBF的训练和测试代码&#xff0c;推荐阅读 《使用OpenCV实现人脸关键点检测》 face alignment 流程图 train阶段 测试阶段 预处理 裁剪图片 tr_data loadsamples(imgpathlistfile, 2); 说明&#xff1a; 本函数用于将原始图片取…

macbook 移动硬盘无法写入_如何升级MacBook笔记本的SSD硬盘-菜鸟折腾系列一

2010 年的时候买了 09 年末的 MACBOOK 小白&#xff0c;由于技术发展&#xff0c;软件越来越吃硬件内存&#xff0c;现在2G 内存别提基本的工作了&#xff0c;连开机都有困难&#xff0c;每次一点就一个风火轮&#xff0c;基本就是一块 13 寸的板砖了。。。众所周知 HDD 机械硬…

face alignment by 3000 fps系列学习总结(二)

准备初始数据 mean_shape mean_shape就是训练图片所有ground_truth points的平均值.那么具体怎么做呢&#xff1f;是不是直接将特征点相加求平均值呢&#xff1f; 显然这样做是仓促和不准确的。因为图片之间人脸是各式各样的&#xff0c;收到光照、姿势等各方面的影响。因此…

parasoft Jtest 使用教程:功能配置之查找错误

2019独角兽企业重金招聘Python工程师标准>>> parasoft Jtest介绍和试用>>> 今天开始为大家带来parasoft Jtest功能配置板块教程&#xff0c;也是系列教程中最重要的一部分。 通过运行Jtest的BugDetective和使用最重要的一套规则来进行编码标准静态分析&…

kmp入门小结

void get_next(char *s) {int len strlen(s);int j 0; int k -1;while (j < len){if (k -1 || s[j] s[k]){j; k; next[j] k;}else k next[k];} } 设t next[i]; next[i] 表示的是 i之前最大的t满足 s[0...t-1] s[i-t...i-1] 比如 0123 4 0123 5 &#xff0c;next[…

基于visual Studio2013解决面试题之0807strstr函数

&#xfeff;&#xfeff;&#xfeff;题目解决代码及点评/*写strstr函数简单的遍历去查找吧 */#include <iostream> #include <stdio.h>const char *my_strstr(const char *str, const char *sub_str) {// 遍历for(int i 0; str[i] ! \0; i){int tem i; //tem保…

aop在项目中的实际运用_mypy在实际项目中的应用

我认为静态类型似乎被吹捧过高了。尽管如此&#xff0c;mypy极低的侵入性能带来许多好处。关于如何在现有的Python项目中添加类型&#xff0c;以下是我的一些想法&#xff0c;大致按重要性排序。首先确保mypy成功运行 Mypy上手时两个很常见的问题有&#xff1a;1.Mypy没有作为构…

face alignment by 3000 fps系列学习总结(三)

训练 我们主要以3000fps matlab实现为叙述主体。 总体目标 我们需要为68个特征点的每一个特征点训练5棵随机树&#xff0c;每棵树4层深&#xff0c;即为所谓的随机森林。 开始训练 分配样本 事实上&#xff0c;对于每个特征点&#xff0c;要训练随机森林&#xff0c;我们需…

HDU 2049 不容易系列之(4)——考新郎( 错排 )

链接&#xff1a;传送门思路&#xff1a;错排水题&#xff0c;从N个人中选出M个人进行错排&#xff0c;即 C(n,m)*d[m]补充&#xff1a;组合数C(n,m)能用double计算吗&#xff1f;第二部分有解释 Part 1. 分别求出来组合数的分子和分母然后相除/******************************…

linux服务器选ubantu或centos_如何通过SSH连接阿里云上的Linux系统

首先SSH是啥&#xff0c;维基一下&#xff1a;Secure Shell&#xff08;安全外壳协议&#xff0c;简称SSH&#xff09;是一种加密的网络传输协议&#xff0c;可在不安全的网络中为网络服务提供安全的传输环境[1]。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接…

paypal之nodejs 框架 Kraken-js 源码分析

本文是基于 kraken-js 0.6.1 版本的 关于如何使用kraken-js 可以去看看官网的使用文档 点击这里 。kraken-js 是基于express之上的&#xff0c;目的在于让工程师更多的去关注代码逻辑&#xff0c;少关注自身的开发环境&#xff0c;所以他将express所有的一些公用的配置都写在了…

go build 参数_Go语言 通过go bulid -tags 实现编译控制

Go语言提供的build tag 条件编译特性&#xff0c;顾名思义&#xff0c;只有在特定条件下才会构建对应的代码。比如下面的源文件只有在设置debug构建标志时才会被构建&#xff1a;// build debugpackage mainvar buildMode "debug"可以用以下命令构建&#xff1a;go …

selinux 的管理

第十单元selinux 的管理一 显示及更改 SELINUX 模式getenforce ###显示selinux模式setenforce 0|1 ##0指permissive警告&#xff0c;1 表示 enforcing强制###vim /etc/sysconfig/selinux ###修改selinux开机状态###注&#xff1a;disable表示关闭&…