免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
如何在VC中調(diào)用CLAPACK

轉(zhuǎn)自http://hi.baidu.com/kaien_space/blog/item/dcb84b8b96347bd4fd1f1011.html

 

 

關(guān)于CLAPACK的使用網(wǎng)上的資料并不多。主要就是官方網(wǎng)站上的安裝說明,以 及LAPACK官方論壇上的一些資料。然而,國外一般科研使用的平臺(tái)都是UNIX或LINUX, 所以對(duì)于windows上使用CLAPACK的相關(guān)介紹就很少。幸運(yùn)的是,官方提供了CLAPACK的windows版本,而且還有專門的 VisualStudio工程包。所以,對(duì)于廣大VS用戶來說可謂非常之方便。

然而,即使如此,很多人在使用的過程中還是出現(xiàn)這樣那樣的問題。其中,多數(shù)的情況都是出在編譯的時(shí)候。而且上網(wǎng)提問多數(shù)都沒人能夠解答。
鑒于此,本人就對(duì)如何在VC上編譯和使用CLAPACK庫,作下簡單的說明。

1、什么是CLAPACK:
CLAPACK是LAPACK的C語言接口。LAPACK的全稱是Linear Algebra PACKage,是非常著名的線性代數(shù)庫。原版的LAPACK是用Fortran寫的,為了方便C/C++程序的使用,就有了LAPACK的C接口CLAPACK。

LAPACK的主頁是 http://www.netlib.org/lapack/
CLAPACK則在 http://www.netlib.org/clapack/。

這兩個(gè)庫都是開源的,可以在官方網(wǎng)站免費(fèi)下載和使用。

2、CLAPACK的安裝:
所謂的安裝其實(shí)就是把源代碼編譯成我們可以調(diào)用的庫.lib文件。

首先從主頁上下載CLAPACK包。http://www.netlib.org/clapack/ 上有很多版本。我們選擇
http://www.netlib.org/clapack/CLAPACK-3.1.1-VisualStudio.zip
大小: 42MB
版本: 3.1.1
是專門提供給VS用戶的。
(注意:VS的版本不能太低。VC6.0是無法使用的。VS2005及以上都應(yīng)該沒問題。本人用的是VS2008。測(cè)試的時(shí)候發(fā)現(xiàn)工程文件版本太老,還需要轉(zhuǎn)換一下呢。當(dāng)然轉(zhuǎn)換后運(yùn)行也很正常。如果你堅(jiān)持要使用VC++6.0那請(qǐng)下載http://www.netlib.org/clapack/CLAPACK3-Windows.zip 這是CLAPACK3.0版,比我介紹的版本3.1.1版要舊一些)

下載解壓后,我們可以看到如下目錄結(jié)構(gòu):
\SRC             CLAPACK的源代碼
\BLAS            BLAS的源代碼
\F2CLIBS       F2C的源代碼

\LIB                 編譯后的庫文件.lib
\INCLUDE       頭文件
\TESTING       一些使用范例程序
\INSTALL        里面有UNIX和其他平臺(tái)下安裝的文件和方法。lawn81.pdf文件是CLAPACK的使用說明,大家使用的時(shí)候可以看看。


這里我要提醒大家。雖然軟件包里已經(jīng)有編譯好的.lib文件,就在\LIB中。但是我建議大家不要直接使用他們,還是自己編譯一下再用才保險(xiǎn)。很多人就是因?yàn)橹苯邮褂盟麄兌鲥e(cuò)的。這點(diǎn)非常重要!如果你就是直接調(diào)用他們失敗的,那不妨先自己編譯一下再試試。

另外,CLAPACK需要F2CLIBS庫,并且使用了blas和tmglib這兩個(gè)外部的庫。這幾個(gè)庫都已經(jīng)包含在了CLAPACK的安裝包中。所以,大家無需另外下載。當(dāng)然,使用前我們還是要重新編譯一下的,原因上面已經(jīng)說過了。

接下來,我詳細(xì)地講講如何編譯他們。
首先雙擊 clapack.vcproj打開工程項(xiàng)目文件。工程中已經(jīng)包含了所有的子項(xiàng)目。
我們根據(jù)個(gè)人需要,編譯成debug模式,或者release模式。為了能在自己的程序調(diào)用中方便的進(jìn)行debug,我這里就以debug模式為例說明。我的系統(tǒng)是win32。如果你是64位系統(tǒng)也是支持的,操作方法類似。

首先編譯F2CLIBS,用于將fortran轉(zhuǎn)換為c語言。
選擇libf2c子項(xiàng)目。直接生成之。編譯過程中可能會(huì)有一些warning,不要理會(huì)他們。編譯成功后,輸出文件是libf2cd.lib。這里的d就 是debug模式,如果是release模式就是libf2cd.lib。輸出文件默認(rèn)路徑是\LIB文件夾。注意,\LIB\Win32下已經(jīng)有一些 lib了。大家最好把他們都先刪除了,以免新舊文件混淆。

接著編譯tmglib。這是一個(gè)矩陣庫。
這個(gè)庫在TESTING\MATGEN里面。選擇他生成就好了。
輸出文件還是在\LIB里面。文件名是tmglibd.lib。


然后是編譯blas,選擇項(xiàng)目blas, 編譯之。輸出文件BLASd.lib。

最后是編譯CLAPACK,生成clapackd.lib.

其他模式對(duì)應(yīng)的輸出文件大家可以參看下表。
這里需要注意的是,不同模式間不要混合使用。

Win 32

ConfigurationF2cReference BLASCLAPACKCBLASWRAPF77BLASWRAPTMGLIB
Win32 - Release

libf2c.lib

BLAS.lib

clapack.lib

cblaswrap.lib

f77blaswrap.lib

tmglib.lib

Win32 - Release no wrap


BLAS_nowrap.lib

clapack_nowrap.lib



tmglib_nowrap.lib

Win32 - Debug

libf2cd.lib

BLASd.lib

clapackd.lib

cblaswrapd.lib

f77blaswrapd.lib

tmglibd.lib

Win32 - Debug no wrap


BLASd_nowrap.lib

clapackd_nowrap.lib



tmglibd_nowrap.lib

x64

ConfigurationF2cReference BLASCLAPACKCBLASWRAPF77BLASWRAPTMGLIB
x64 - Release

libf2c.lib

BLAS.lib

clapack.lib

cblaswrap.lib

f77blaswrap.lib

tmglib.lib

x64 - Release no wrap


BLAS_nowrap.lib

clapack_nowrap.lib



tmglib_nowrap.lib

x64 - Debug

libf2cd.lib

BLASd.lib

clapackd.lib

cblaswrapd.lib

f77blaswrapd.lib

tmglibd.lib

x64 - Debug no wrap


BLASd_nowrap.lib

clapackd_nowrap.lib



tmglibd_nowrap.lib

3、如何調(diào)用CLAPACK:
前面,我們已經(jīng)生成了CLAPACK的庫文件了。那么如何在自己的程序中使用他們呢?
其實(shí)很簡單。你所需要的只有兩部分:
1)頭文件
頭文件就是.h文件。存放在\INCLUDE中。在自己的工程里加入這個(gè)目錄就行了。里面的文件最好不要作任何修改。程序中主要調(diào)用的頭文件是clapack.h和f2c.h。

2)庫文件
庫文件就是我們前面編譯生成的那些lib文件了。

這里,我就以一個(gè)具體的調(diào)用實(shí)例詳細(xì)地說明如何在VC中設(shè)置和使用CLAPACK。
首先,VC中項(xiàng)目的設(shè)置方式是:
項(xiàng)目的屬性里。C/C++選項(xiàng)卡中,附加包含目錄里添加\INCLUDE目錄。
連接器選項(xiàng)卡中。附加庫目錄里添加\LIB\Win32目錄。然后附加依賴項(xiàng)添加libf2cd.lib BLASd.lib clapackd.lib tmglibd.lib。(根據(jù)不同的編譯模式和個(gè)人需要以及系統(tǒng)需要選擇庫文件)

另外,如果想在調(diào)試時(shí)能對(duì)庫函數(shù)進(jìn)行源碼級(jí)調(diào)試。那么需要在VS的 工具--選項(xiàng)--項(xiàng)目和解決方案--VC++目錄 中添加\SRC的目錄。

本文,我們將調(diào)用CLAPACK的一個(gè)函數(shù)dgesvd_()來學(xué)習(xí)使用的方法。

注意: 包括此函數(shù)在內(nèi)的所有的CLAPACK函數(shù)可以在\SRC下找到源代碼,并在代碼中有函數(shù)參數(shù)的說明信息。dgesvd_的代碼文件就是dgesvd.c。

dgesvd_的函數(shù)聲明:
int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n,
doublereal *a, integer *lda, doublereal *s, doublereal *u, integer *
ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork,
integer *info)

dgesvd_的功能是對(duì)一個(gè)實(shí)矩陣A進(jìn)行SVD分解(singular value decomposition)。
即 A = U * SIGMA * transpose(V)

dgesvd.c文件里有詳細(xì)地函數(shù)說明和參數(shù)說明。
    SIGMA is an M-by-N matrix which is zero except for its  
    min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and  
    V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA  
    are the singular values of A; they are real and non-negative, and  
    are returned in descending order. The first min(m,n) columns of  
    U and V are the left and right singular vectors of A.  

    Note that the routine returns V**T, not V.  
    .........................................

參數(shù)的具體說明也請(qǐng)參看這個(gè)文件的 Arguments部分

代碼:
#include <stdio.h>
#include <process.h>

//因?yàn)槌绦蚴荂++,而CLAPACK是f2c程序轉(zhuǎn)換的C語言版本,所以在此處用extern關(guān)鍵字調(diào)用
extern"C"
{
#include <f2c.h>
#include <clapack.h>
}

#define SIZE 4

int main()
{
     char JOBU;
     char JOBVT;

     int i;

     //數(shù)據(jù)類型integer是fortran里的。這里在C++下可以使用的原因是f2c.h文件中已經(jīng)作了定義
     integer M = SIZE;
     integer N = SIZE;
     integer LDA = M;
     integer LDU = M;
     integer LDVT = N;
     integer LWORK;
     integer INFO;
  
     integer mn = min( M, N );
   
     integer MN = max( M, N );
    
     double a[SIZE*SIZE] = { 16.0, 5.0, 9.0 , 4.0, 2.0, 11.0, 7.0 , 14.0, 3.0, 10.0, 6.0, 15.0, 13.0, 8.0, 12.0, 1.0};
     double s[SIZE];
     double wk[201];
     double uu[SIZE*SIZE];
     double vt[SIZE*SIZE];
    
       JOBU = 'A';
    
       JOBVT = 'A';
    
    LWORK = 201;
   
/* Subroutine int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n,
        doublereal *a, integer *lda, doublereal *s, doublereal *u, integer *
        ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork,
        integer *info)
*/
    dgesvd_( &JOBU, &JOBVT, &M, &N, a, &LDA, s, uu, &LDU, vt, &LDVT, wk, &LWORK, &INFO);
         
    printf("INFO=%d \n", INFO );         

    for ( i= 0; i< SIZE; i++ ) {
        printf("s[ %d ] = %f\n", i, s[ i ] );
    }

    system("pause");

    return 0;
}    


運(yùn)算結(jié)果輸出:
INFO=0
s[ 0 ] = 34.000000
s[ 1 ] = 17.888544
s[ 2 ] = 4.472136
s[ 3 ] = 0.000000

注意:這個(gè)例子中我們使用的庫是clapackd.lib。
libf2cd.lib BLASd.lib tmglibd.lib都沒有用到。
總之需要什么庫就用什么庫。關(guān)鍵點(diǎn)是一定要自己編譯生成這些.lib文件來使用。不要用現(xiàn)成的,以免出錯(cuò)。

                                                                                 kaien

                                                                              2009年2月6日

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
opencv2.3在vs2010上的配置方法
VC--用DLL生成LIB文件 -- 興趣,才是王道—阿高 -- 編程愛好者博客
7VS2005/2008下如何配置OpenGL函數(shù)庫
矩陣運(yùn)算庫Armadillo,Eigen,MATCOM在windows+vs2010環(huán)境下的安裝和測(cè)評(píng)
在VC++6.0下設(shè)置GDI+(最簡介的方法)
VC靜態(tài)連接庫的生成和使用
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服