矩陣運算庫Armadillo,Eigen,MATCOM在windows+vs2010環境下的安裝和測評

轉自 http://blog.sina.com.cn/s/blog_a4864fde0101fyqc.html作為一個遙感圖像處理方向研究生,筆者在編程的時候免不得要和矩陣運算打交道,各種矩陣乘法協方差特徵值。雖然在自己的研究實驗中更喜歡用MATLAB來作為工具,但是在完成工程項目編軟體的時候必須要用C++來作為編程語言。在C++中並不能像MATLAB一樣,非常方便的進行矩陣運算。當然也可以自己編一些列矩陣運算的函數(筆者以前就干過這事),不過這個運算效率實在無法滿足要求。目前國際上提供了很多矩陣運算線性代數的庫,這些庫都進行了基於CPU和多核的運算優化,自然比我們自己做的這些函數效率要高的多,而且很多庫都有著非常友好的使用方式,這就好比有了又快又舒服汽車自然也就不用再用自己的雙腿走到累死。經過了多次折騰,筆者終於大概了解了幾個比較常用的矩陣庫的安裝和使用方式,在這裡做一個簡要介紹,希望能為其他人提供一個方便。筆者最早是使用的別人給的MATCOM庫,這個庫比較古老、不開源而且早就停止維護,唯一的優點就是可以在vc6.0上使用···最近又開始在找更加優質的矩陣運算庫,就發現了Armadillo,並且在同學的推薦下用了一下Eigen,發現在vs2010的環境下,這兩個庫確實比MATCOM要好上N倍。以下就是各個運算庫的介紹和安裝,本文重點介紹的是Armadillo+OpenBLAS的組合,這個組合是我目前使用的庫中最簡單效率又最高的。1、MATCOMMATCOM矩陣庫在國內用的貌似還不少,筆者就是從別的同學那裡得到的這個庫。根據度娘的介紹,MATCOM其實是mathtools公司提供講MATLAB代碼移植到c++上的一個工具,具體兩者的關係筆者搞不太清,但是MATCOM在4.5版本之後據說就被合併到MATLAB中,沒有再更新和維護。MATCOM有兩大優點,一是和MATLAB的使用方式非常像,基本函數都叫一個名字,所以可以非常容易地將MATLAB代碼移植到C++上;二是可以在VC6上使用,這一點非常重要···因為目前大多數的庫都已經不再支持VC6了。不過MATCOM的缺點也非常多,首先MATCOM並不開源,這一點在完成工程項目編軟體的時候很麻煩;其次MATCOM在MathTools公司被合併之後就再也沒有更新和維護,因此在代碼的速度和健康程度上已經是落後於時代了。所以筆者認為除非是必須在VC6下進行編程,不然不建議再使用MATCOM這個矩陣庫。關於MATCOM的具體應用,可以參見http://blog.sina.com.cn/s/blog_60f8483a0100gay7.html這個博客,講解的非常清楚。在度娘中搜索,也可以找到很多關於MATCOM的文章。不過筆者要提醒一點,在筆者的使用中發現有一些文章和說明中提到的函數和真正使用起來並不一樣,這可能是版本差異,所以需要自己動手嘗試。筆者所獲得的MATCOM一共只有4個文件,是編譯好了的v4501v.lib,v4501v.dll,ago4501.dll和matlib.h文件。這幾個文件讀者可以在CSDN等網站上搜索下載。安裝方式很簡單,只需要在工程中添加上v4501v.lib,在代碼頭包含#include"matlib.h",並且把v4501v.dll,ago4501.dll放到應用文件,例如DEBUG或者RELEASE文件夾中,就可以使用。2、ArmadilloArmadillo是一個開源的矩陣運算庫,這個庫可以在開源中國下載到http://www.oschina.net/p/armadillo+cpp+libraryArmadillo的主頁也非常友好http://arma.sourceforge.net/這個庫其實是對底層的矩陣運算庫(例如BLAS,LAPACK)的封裝,也就是說,這個庫本身的計算能力其實不強,但是這個庫可以配合開源的底層庫來使用,例如最基本的BLAS+LAPACK或者改進後的OpenBLAS,ACML還有強大的MKL。Armadillo的速度主要就是由底層庫決定,其代碼使用可以說是非常非常的簡單,基本和MATLAB的代碼沒有什麼差別,總之筆者是用的非常爽。Armadillo的更新很頻繁,這正是它還很有生命力的證據。Armadillo可以從開源中國的連接或者是其主頁的連接上下載,其安裝說起來就是幾步1-將下載後的文件解壓到某一個文件夾,例如D:ProgramFilesArmadilloarmadillo-3.910.0;2-將D:ProgramFilesArmadilloarmadillo-3.910.0include目錄包含到在VS工程的文件目錄中;3-如果想要使用BLAS和LAPACK等底層庫的加速,需要在將D:ProgramFilesArmadilloarmadillo-3.910.0includearmadillo_bitsconfig.hpp中的取消一下兩行代碼的注釋#defineARMA_USE_LAPACK#defineARMA_USE_BLAS筆者推薦取消注釋,這樣才能發揮Armadillo的能力。4-安裝就基本完成了,以上安裝可以參考以下兩個網址http://www.cnblogs.com/youthlion/archive/2012/05/15/2501465.htmlhttp://blog.csdn.net/houston11235/article/details/8266646在度娘上可以搜索到很多Armadillo的安裝文章,不過有一些是基於linux的,所以大家可以找針對windows的文章。安裝完畢後需要實踐一下才能檢驗是否知道怎麼使用,在壓縮文件目錄中,有一個examples文件夾,下面有兩個例子,安裝結束後請運行一下兩個例子。5-因為在Armadillo中使用到了BLAS和LAPACK,在exampleslib_win32中提供了兩個已經編譯好了的LIB和DLL,在使用到Armadillo的工程中加入兩個LIB文件,並把DLL文件拷到執行文件的目錄下。在這個文件夾中提供的兩個庫lapack_win32_MT和blas_win32_MT是提前編譯好了的,非常好用,筆者測試後發現比網上自己下載的LAPACK和BLAS要快很多,而且還不需要其他的DLL支持。如果讀者不想麻煩,就可以直接用這兩個庫。6-請把壓縮文件中的Readme.txt好好閱讀一遍,這個幫助文件其實就講的很詳細了。還有docs.html,是一份非常詳細的使用說明。下載最新的LAPACK可能有讀者想使用自己下載的LAPACK庫,筆者推薦在以下網址下載http://icl.cs.utk.edu/lapack-for-windows/lapack/index.html#build讀者可以直接在這個網址搜索「UsingLAPACKE subroutines in a Visual Studio C/C++Project」,在這個小節下面有一個編譯好的LAPACKEexamples,裡面有編譯好的LIB和DLL,可以拿來直接使用。不過需要注意的是,網上目前大多數庫,包括LAPACK和OpenBLAS,都是使用MinGW進行編譯的,所以為了能順利使用這些庫,請讀者先去安裝一個MinGW吧。請在安裝的時候選擇C,C++和FORTRAN,這些編譯環境都是經常需要的。讀者自己下載LAPACK之後,就可以使用LIB和DLL替換原來Armadillo提供的LIB和DLL,不過因為網上下載的LAPACK是使用MinGW編譯的,需要相應的編譯環境才能使用,單獨使用會提示缺少必要的DLL。有兩個辦法解決這個問題,一是安裝MinGW,並且在系統Path中進行配置,具體請度娘;二是將MinGW安裝目錄bin文件夾中的相應DLL拷到執行文件目錄下,缺什麼考什麼。筆者推薦第二種方式,因為編好的軟體一般都會在其他電腦上運行,不能要求所有的電腦都有MinGW環境。一般需要的DLL是libgcc_s_dw2-1.dll,libgfortran-3.dll和libquadmath-0.dll三個。使用OpenBLAS在Armadillo的Readme.txt中,一共推薦了三個庫,並說「The OpenBLAS, MKL and ACMLlibraries are generally thefastest.」其中筆者推薦要用的,就是OpenBLAS。OpenBLAS是一個開源的庫,這一點正好能夠滿足Armadillo聯合使用工程項目編程的需要。下面就是OpenBLAS的主頁http://xianyi.github.io/OpenBLAS有很多優點,計算效率高,開源免費,不過最最重要的一點,這是中國人寫的!OpenBLAS是由中科院軟體研究所的張先軼開發的一個開源計算庫。為什麼說這是一個很重要的優點,倒不是說筆者呼籲支持國貨,而是如果有問題可以直接用中文問開發者!而且還是一個很熱心的開發者!還有什麼比這更大的優點。下面就是作者Xianyi Zhang在開源中國開的博客http://my.oschina.net/u/274748?ft=blog筆者在有問題的時候晚上9:29留言,開發者9:35就回答了,第二天更是寫了一個「在Windows上Armadillo如何使用OpenBLAS」的博客,筆者當時是感動得淚流滿面啊。這就是開發者提供的如何使用Armadillo+OpenBLAS,裡面步驟寫的很詳細,讀者可以按照這個博客來做http://my.oschina.net/u/274748/blog/158728唯一要補充一點就是這個庫運行也需要MinGW環境,上面關於LAPACK的文字中有提到如何解決。只不過對於OpenBLAS只需要libgfortran-3.dll和libquadmath-0.dll。在使用OpenBLAS的時候,只需要將LIB文件添加到工程中,再把DLL拷到執行文件目錄下就行了。在筆者安裝的時候拷到一些英文的安裝方法說還需要BLAS或者LAPACK,其實OpenBLAS都已經包含了,除了MinGW環境不需要額外的庫。OpenBLAS已經編譯好的文件可以在主頁上直接下載到,也可以下載源代碼自己編譯,關於如何編譯作者已經在他的博客中說道了。Armadillo+OpenBLAS是筆者最推薦的組合。其他庫MKL ACML ATLAS除了上面提到的BLAS+LAPACK和OpenBLAS,其他著名的庫有Intel MKL,AMDACML以及開源的ATLAS。其中MKL是收費的,ACML和ATLAS是免費的。MKL聽說是效率最高的庫,但是在Windows下要收費,Linux免費,這是赤裸裸地鄙視Windows程序員的節奏嗎。MATLAB就是使用的MKL和ATLAS。當然,有心人總能在網上找到免費的MKL,不過因為只能自己用,所以筆者也就沒認真研究。曾經下載到一個MKL的庫試過,發現不如OpenBLAS這樣容易加到Armadillo,老是出錯,也就沒再深入過。ACML是免費的,不過貌似需要編譯,筆者找到合心的庫之後就不想麻煩了,就沒弄,如果有興趣的讀者可以自己去網上下載。ATLAS因為是需要編譯,筆者也懶了沒弄。3.EigenEigen也是一個開源的矩陣運算庫,筆者在同學的推薦下嘗試了一下這個庫。據筆者同學說,在Windows下Eigen比OpenBLAS效率更高,而且在下面的這個測評中,Eigen比Armadillo要快很多,但是筆者猜這裡的Armadillo沒有使用OpenBLAS.http://blog.csdn.net/houston11235/article/details/8501135Eigen不是以動態庫的形式,而是以頭文件的方式使用,因此不需要再包含其他的DLL,應該算比較方便的。Eigen的安裝方式很簡單,就是將下載的壓縮包直接解壓,例如D:ProgramFilesEigen,然後在VS工程中直接包含路徑D:ProgramFilesEigenEigen,也就是根目錄下的Eigen文件夾就行了。筆者猜測Eigen可能可以在VC6下使用,如果感興趣的讀者可以自己去嘗試一下。Eigen最大的缺點就是和MATLAB的使用方法差得太多,筆者用起來特別費勁。不過Eigen屬於大多數演算法都用模板函數,可能有人會覺得用起來更方便。以上就是筆者最近嘗試用過的矩陣運算庫,接下來筆者會進行一個簡單的測評。
推薦閱讀:

帶你走進身邊的環境教育基地 08
還給我們一個美麗的地球
【一周綜述】治水清河 南整北治 美化環境
屋宇近處不可有它,有了它對家運和健康都不好!
性別歧視 揭秘惡劣的女性職場環境

TAG:環境 | 矩陣 | 矩陣運算 | 測評 | 安裝 | 運算 | Eigen | 2010 |