LAPACK,其名为Linear Algebra PACKage的缩写,是Oak Ridge 国家实验室、加州大学Davis分校和Illinois大学联合开发的线性代数函数库,用于在不同高性能计算环境上高效求解数值线性代数问题,是以Fortran编程语言编写。LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。
C语言版本的lapack主页在[http://www.netlib.org/clapack/],不过单从使用的角度来看,还是不够方便,它提供了全部的源代码,要使用的时候先必须编译出lib文件。问题在于,很多用户下载下来以后,编译都不成功。幸亏有好心人将lapack制作了dll文件,省略了不少麻烦。现在介绍一下如何使用dll版本的lapack。
1) 下载dll及头文件
进入链接 [http://www.fi.muni.cz/~xsvobod2/misc/lapack/],dll文件下载 shared version那个版本(我下的是shared version (statically-linked, release):),头文件则位于页面的最下面的“gzipped header files”。
2)vs2005 新建windows console项目,代码如下:
//// eigvector.cpp : Defines the entry point for the console application.
////
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//注意我下的是 shared version (statically-linked, release):这个版本!
//其他版本,下面两句是不同的
#pragma comment(lib, "lapack_win32_MT.lib")
#pragma comment(lib, "blas_win32_MT.lib")
extern "C" {
#include <f2c.h>
#include <sgesv.h>
}
int _tmain(int argc, _TCHAR* argv[])
{
integer M=3 ;
integer N=1;
real a[9]={4,3,11,2,-1,0,-1,2,3};
real b[3]={2,10,8};
integer lda;
integer ldb;
integer INFO;
lda=M;
ldb=M;
integer *ipiv;
ipiv = (integer *)new integer[M];
sgesv_(&M, &N, a, &lda,ipiv, b, &ldb, &INFO);
if(INFO==0)
{
for(int i=0; i<M; i++)
{
cout<<b[i]<<endl;
}
}
else
{
cout<<"Failed."<<endl;
}
return 0;
}
3) f2c.h是公用头文件,里面typedef了很多数据类型以及一些struct。sgesv_是解线性方程的一个函数,所以必须
加上它的头文件sgesv.h。这个时候编译,肯定出问题了,环境还没配置好嘛。将shared-lib.zip解压,可以看到里
面有blas和lapack的lib和dll文件;将headers.tar.gz解压,理由有blas和lapack两个文件夹,分别含有各自的头
文件。在c盘下新建folder,取名lapack, 里面新建两个folder, 分别为include和lib。把lapack和blas文件夹放在
include下面,把lib文件放在lib文件夹下面。tool->options->projects and solutions->VC++ Directories,
找到show directories for, 分别为Include files和Library files添加刚才新建的include文件夹和lib文件夹的路径(include files: C:/lapack/include/blas C:/lapack/include/lapack 以及 Library files:C:/lapack/lib)在debug模式下编译执行,还是报错!!!说dll文件找不到,把shared-lib.zip解压出来的两个dll文件放到
你的project下面的debug下,就没问题了。输出结果为-14,56,54,是不是一样的呢?
欢迎各位交流 shaolongchou@126.com