CLAPACK的安装与简单使用

CLAPACKLAPACKC语言接口。LAPACK的全称是Linear Algebra PACKage,是非常著名的线性代数库。LAPACK是用Fortran写的,为了方便C/C++程序的使用,就有了LAPACKC接口库CLAPACKLAPACK的主页是http://www.netlib.org/lapack/CLAPACK则在http://www.netlib.org/clapack/
 
安装CLAPACK首先自从其主页上下载CLAPACKhttp://www.netlib.org/clapack/clapack.tgz,解压。在其目录下的INSTALL目录中有make.inc的范本文件,比如在linux下就是make.inc.LINUX,将这个文件拷到CLAPACK目录下并改名为make.inc,并修改此文件中的相应参数,如果需要的话。CLAPACK需要F2CLIBSlibI77.alibF77.a,一个tmglibblas,这几个库都包含在了CLAPACK的安装包中,但是blas可以选用其他优化过的版本以得到更好的性能。在此我们使用CLAPACK中的blas
 
首先编译F2CLIBS,用于将fortran转换为c语言,在CLAPACK目录下,make f2clib,在
CLAPACK/F2CLIBS下就会生成libI77.alibF77.a
编译tmglibCLAPACK目录下,make tmglib,会生成CLAPACK/tmglib_LINUX.a
编译blasCLAPACK目录下,make blaslib,会生成CLAPACK/blas_LINUX.a
最后是编译CLAPACKmake,会生成CLAPACK/lapack_LINUX.a
 
CLAPACK下的clapack.h就是所需要的头文件,除此之外还需要的一个头文件是F2CLIBS/f2c.h
 
现在就通过使用CLAPACK中的一个函数sgesv_解线性方程组来学习一下使用的方法。
 
包括此函数在内的所有函数可以在CLAPACK/SRC下找到源代码,并在代码中有函数参数的说明信息。sgesv_的代码文件就是sgesv.c
 
int sgesv_(integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info)
 
sgesv_的功能是使用LU分解法解线性方程组AX=B,其中A是一个n*n的方阵。
 
integer *n, 方程的个数,也就是A的行数和列数
integer *nrhs, B的列数
real *a, 存储矩阵A数据的一维数组,在fortran中,数组是列主序存储,在此a中的二维数据也必须是列主序
integer *lda, 等于n
integer *ipiv, 一个输出数据数组,数组大小是n,具体什么功能不太明白,但是似乎不影响最后结果,谁明白请告诉我
real *b,存储矩阵B数据的一维数组,在fortran中,数组是列主序存储,在此b中的二维数据也必须是列主序
integer *ldb, 等于n
integer *info,输出参数,如果返回此参数为0,表示函数正常退出,否则表示出错
 
在此,我用了高教同济大学版线性代数第二版106页,2(1)的数据。
 
A:
4,2,1
3,1,2
11,0,3
 
B:
2
10
8
 
代码:
#include<iostream>
usingnamespace std;
#include<F2CLIBS/f2c.h>
//因为程序是C++,而CLAPACKC语言写的,所以在此处用extern关键字
extern"C"
{
 
    #include<clapack.h>
}
int main(void) {
   
    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[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 EXIT_SUCCESS;
}
 
程序编译链接的时候,lapack_LINUX.atmglib_LINUX.ablas_LINUX.alibF77.alibI77.a 这几个库文件都需要链接进去。
 
运算结果:
-14
56
54
 
阅读更多
换一批

请问如何安装clapack工具包?

12-13

由于是初学VC,需要使用Clapack,但我在Visual studio 2008和VC 6里都没安装成功。rnrn我参考的是如下安装方法:rn*******************************************************rn*******************************************************rn“安装CLAPACK-Windows首先从其主页上下载CLAPACK-Windows包,解压,然后用VC(我用的是VS2005)打开clapack.dsw,编绎既可。rnCLAPACK下的clapack.h是所需要的头文件,除此之外还需要的一个头文件是F2CLIBS/f2c.h。rn现在通过使用CLAPACK中的一个函数sgesv_解线性方程组来学习一下使用的方法。rn包括此函数在内的所有函数可以在CLAPACK/SRC下找到源代码,并在代码中有函数参数的说明信息。sgesv_的代码文件就是sgesv.c。rnrnint sgesv_(integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info)rnrnsgesv_的功能是使用LU分解法解线性方程组AX=B,其中A是一个n*n的方阵。rnrn以下是代码:rnrnrn// mytest.cpp : Defines the entry point for the console application.rn//rnrn#include "stdafx.h"rnrn#include rnrnusing namespace std;rnrn#include rnrn//因为程序是C++,而CLAPACK是C语言写的,所以在此处用extern关键字rnextern "C"rnrn#include rnrnrnrnint _tmain(int argc, _TCHAR* argv[])rnrn integer M=3 ;rn integer N=1;rn real a[9]=4,3,11,2,-1,0,-1,2,3;rn real b[3]=2,10,8;rn integer lda;rn integer ldb;rn integer INFO; rnrn lda=M;rn ldb=M; rn integer *ipiv;rn ipiv = (integer *)new integer[M];rnrn sgesv_(&M, &N, a, &lda,ipiv, b, &ldb, &INFO);rnrn if(INFO==0)rn rn for(int i=0; i

没有更多推荐了,返回首页