2024年4月2日发(作者:)

如何在VC中调用CLAPACK

转自

/kaien_space/blog/item/

关于

CLAPACK

的使用网上的资料并不多。主要就是官方网站上的安装说明,以

LAPACK

官方论

坛上的一些资料。然而,国外一般科研使用的平台都是

UNIX

LINUX,

所以对于

windows

上使用

CLAPACK

的相关介绍就很少。幸运的是,官方提供了

CLAPACK

windows

版本,而且还有专门的

VisualStudio

工程包。所以,对于广大

VS

用户来说可谓非常之方便。

然而,即使如此,很多人在使用的过程中还是出现这样那样的问题。其中,多数的情况都是出在编译的时

候。而且上网提问多数都没人能够解答。

鉴于此,本人就对如何在

VC

上编译和使用

CLAPACK

库,作下简单的说明。

1

、什么是

CLAPACK:

CLAPACK

LAPACK

C

语言接口。

LAPACK

的全称是

Linear Algebra PACKage

,是非常著名的线性

代数库。原版的

LAPACK

是用

Fortran

写的,为了方便

C/C++

程序的使用,就有了

LAPACK

C

接口

CLAPACK

LAPACK

的主页是

/lapack/

CLAPACK

则在

/clapack/

这两个库都是开源的,可以在官方网站免费下载和使用。

2

CLAPACK

的安装

:

所谓的安装其实就是把源代码编译成我们可以调用的库

.lib

文件。

首先从主页上下载

CLAPACK

包。

/clapack/

上有很多版本。我们选择

/clapack/

大小

: 42MB

版本

: 3.1.1

是专门提供给

VS

用户的。

(注意

:VS

的版本不能太低。

VC6.0

是无法使用的。

VS2005

及以上都应该没问题。本人用的是

VS2008

测试的时候发现工程文件版本太老,还需要转换一下呢。当然转换后运行也很正常。如果你坚持要使用

VC++6.0

那请下载

/clapack/

这是

CLAPACK3.0

版,比我

介绍的版本

3.1.1

版要旧一些)

下载解压后,我们可以看到如下目录结构

:

SRC CLAPACK

的源代码

BLAS BLAS

的源代码

F2CLIBS F2C

的源代码

LIB

编译后的库文件

.lib

INCLUDE

头文件

TESTING

一些使用范例程序

INSTALL

里面有

UNIX

和其他平台下安装的文件和方法。

文件是

CLAPACK

的使用说明,

大家使用的时候可以看看。

这里我要提醒大家。虽然软件包里已经有编译好的

.lib

文件,就在

LIB

中。但是我建议大家不要直接

使用他们,还是自己编译一下再用才保险。很多人就是因为直接使用他们而出错的。这点非常重要!如果

你就是直接调用他们失败的,那不妨先自己编译一下再试试。

另外,

CLAPACK

需要

F2CLIBS

库,并且使用了

blas

tmglib

这两个外部的库。这几个库都已经包

含在了

CLAPACK

的安装包中。所以,大家无需另外下载。当然,使用前我们还是要重新编译一下的,原

因上面已经说过了。

接下来,我详细地讲讲如何编译他们。

首先双击

打开工程项目文件。工程中已经包含了所有的子项目。

我们根据个人需要,编译成

debug

模式,或者

release

模式。为了能在自己的程序调用中方便的进行

debug

我这里就以

debug

模式为例说明。我的系统是

win32

。如果你是

64

位系统也是支持的,操作方法类似。

首先编译

F2CLIBS

,用于将

fortran

转换为

c

语言。

选择

libf2c

子项目。直接生成之。编译过程中可能会有一些

warning

,不要理会他们。编译成功后,输出文

件是

。这里的

d

debug

模式,如果是

release

模式就是

。输出文件默认路径是

LIB

文件夹。注意,

LIBWin32

下已经有一些

lib

了。大家最好把他们都先删除了,以免新旧文件混淆。

接着编译

tmglib

。这是一个矩阵库。

这个库在

TESTINGMATGEN

里面。选择他生成就好了。

输出文件还是在

LIB

里面。文件名是

然后是编译

blas

,选择项目

blas,

编译之。输出文件

最后是编译

CLAPACK

,生成

.

其他模式对应的输出文件大家可以参看下表。

这里需要注意的是,不同模式间不要混合使用。

Win 32

Configura

tion

Win32 -

Release

Win32 -

Release no

wrap

Win32 -

Debug

Win32 -

Debug no

wrap

F2c

b

libf2cd

.lib

Reference

BLAS

CLAPACK

CBLASWF77BLASW

RAP RAP

TMGLIB

cblaswrap.f77blaswrap

lib

.lib

BLAS_nowraclapack_nowra

tmglib_nowra

cblaswrapf77blaswrap

BLASd_nowrclapackd_nowr

tmglibd_nowr

x64

Configura

tion

x64 -

Release

x64 -

Release no

wrap

F2c

b

Reference

BLAS

CLAPACK

CBLASWF77BLASW

RAP RAP

TMGLIB

cblaswrap.f77blaswrap

lib

.lib

BLAS_nowraclapack_nowra

tmglib_nowra

x64 -

Debug

x64 -

Debug no

wrap

libf2cd

.lib

cblaswrapf77blaswrap

BLASd_nowrclapackd_nowr

tmglibd_nowr

3

、如何调用

CLAPACK:

前面,我们已经生成了

CLAPACK

的库文件了。那么如何在自己的程序中使用他们呢?

其实很简单。你所需要的只有两部分

:

1)

头文件

头文件就是

.h

文件。存放在

INCLUDE

中。在自己的工程里加入这个目录就行了。里面的文件最好不要作

任何修改。程序中主要调用的头文件是

clapack.h

f2c.h

2)

库文件

库文件就是我们前面编译生成的那些

lib

文件了。

这里,我就以一个具体的调用实例详细地说明如何在

VC

中设置和使用

CLAPACK

首先,

VC

中项目的设置方式是

:

项目的属性里。

C/C++

选项卡中,附加包含目录里添加

INCLUDE

目录。

连接器选项卡中。附加库目录里添加

LIBWin32

目录。然后附加依赖项添加

(

根据不同的编译模式和个人需要以及系统需要选择库文件

)

另外,如果想在调试时能对库函数进行源码级调试。那么需要在

VS

工具

--

选项

--

项目和解决方案

--VC++

目录

中添加

SRC

的目录。

本文,我们将调用

CLAPACK

的一个函数

dgesvd_()

来学习使用的方法。

注意

:

包括此函数在内的所有的

CLAPACK

函数可以在

SRC

下找到源代码,并在代码中有函数参数的说

明信息。

dgesvd_

的代码文件就是

dgesvd.c

dgesvd_

的函数声明

:

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_

的功能是对一个实矩阵

A

进行

SVD

分解

(singular value decomposition)

A = U * SIGMA * transpose(V)

dgesvd.c

文件里有详细地函数说明和参数说明。

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.

.........................................

参数的具体说明也请参看这个文件的

Arguments

部分代码:

#include

#include

//

因为程序是

C++

,而

CLAPACK

f2c

程序转换的

C

语言版本,所以在此处用

extern

关键字调用

extern"C"

{

#include

#include

}

#define SIZE 4

int main()

{

char JOBU;

char JOBVT;

int i;

//

数据类型

integer

fortran

里的。这里在

C++

下可以使用的原因是

f2c.h

文件中已经作了定义

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 ] = %fn", i, s[ i ] );

}

system("pause");

return 0;

}

运算结果输出

:

INFO=0

s[ 0 ] = 34.000000

s[ 1 ] = 17.888544

s[ 2 ] = 4.472136

s[ 3 ] = 0.000000

注意:这个例子中我们使用的库是

都没有用到。

总之需要什么库就用什么库。关键点是一定要自己编译生成这些

.lib

文件来使用。不要用现成的,以免出错。

kaien

2009

2

6