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
日


发布评论