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"?
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 = 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