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的更新说明:
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),
然后:
INSTALL
工程(设为启动项目)。
这样的话,就安装好了。我们接下来,就可以使用了。我们是在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 = b Vector4d 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,将源程序路径加入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中找到,复制即可。
这样就可以运行了,结果为:
附:
我编译的库: