Visual Studio 2010 + CLAPACK

来源:互联网 发布:视频设置背景音乐软件 编辑:程序博客网 时间:2024/06/13 05:58

LAPACK(Linear Algebra PACKage)库,是用Fortran语言编写的线性代数计算库,包含线性方程组求解(AX=b)、矩阵分解、矩阵求逆、求矩阵特征值、奇异值等。该库用BLAS库做底层运算,许多高层的数学库都用BLAS和LAPACK做底层。

BLAS(Basic Linear Algebra Subprograms)库,是用Fortran语言实现的向量和矩阵运算库,是许多数值计算软件库的核心, 但也有一些其它的包装, 如cblas是C语言, 也有C++的包装, boost/ublas 是C++ template class的实现;另外还有一些特别的实现, 如intel MKL, AMD core math library blas就是做向量、矩阵的基本运算,如加、减、乘等操作。

CLAPACK是LAPACK的C语言接口,为了方便C/C++程序的使用,就有了LAPACK的C接口CLAPACK。

LAPACK库的下载地址:http://www.netlib.org/lapack/

LAPACK库的说明文档:http://www.netlib.org/lapack/lug/lapack_lug.html

LAPACK库的头文件(C语言的)、Lib文件(MDd和MTd两种类型的,以及调试和发布版的)和源代码(Fortran语言,主要用于查看各个函数的参数的说明):http://www.fi.muni.cz/~xsvobod2/misc/lapack/
一:安装

(1):下载,http://www.netlib.org/clapack/CLAPACK-3.1.1-VisualStudio.zip

(2):解压缩后用VS打开clapack.vcproj,然后会进行工程转换(由vs2005转为vs2010),转换完成后如下图所示:

Visual Studio 2010 + CLAPACK - leon - Fly Freely

(3):删除LIB下的所有文件,然后按顺序生成:libf2c,tmglib,blas,clapack。分别在32位与64位进行编译,会生成\LIB\Win32与\LIB\x64两个文件,对应的debug版本:libf2cd.lib,tmglibd.lib,BLASd.lib,clapackd.lib;Release版本:libf2c.lib,tmglib.lib,BLAS.lib,clapack.lib.

(4):将目录下的INCLUDE,LIB,SRC三个文件夹拷贝出来,然后放到一个统一的文件夹中,以后进行工程配置时要引用这个文件夹,比如我的:C:\Dependences\CLapack\Usage。至此,安装已经完成,以后讲述如何使用。

二:使用:以从网上得到的一段程序为例(程序见最后):

(1):Project->Property->C/C++->General->Additional Include Directories中输入之前进行拷贝的INCLUDE文件夹,如我的:C:\Dependences\CLapack\Usage\INCLUDE

(2):Project->Property->Linker->General->Additional Library Directories中输入之前的LIB文件夹路径,如我的:C:\Dependences\CLapack\Usage\LIB\x64

(3):Project->Property->Linker->Input中输入:libf2cd.lib,blasd.lib,tmglibd.lib,clapackd.lib

(4):Project->Property->C/C++->Code Generation->Runtime Library->Multi-threaded(/MT)

至此已经完成。


#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <f2c.h>
//因为程序是C++,而CLAPACK是f2c程序转换的C语言版本,所以在此处用extern关键字调用
extern"C"
{
#include <clapack.h>
}
#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 ] = %f\n", i, s[ i ] );
}
_getch();
return 0;
}

本文在写作过程中引用了以下几篇文章的部分:

http://janpo.blog.edu.cn/2010/511391.html

http://blog.sina.com.cn/s/blog_40b056950100htpt.html

http://www.deuxmille.org/archives/1500

0 0