CLAPACK的安装与简单使用

 

CLAPACK的安装与简单使用

 

烤鱼片(@eii.dlmu)

cleverysm@163.com

 

 

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

编译tmglib CLAPACK目录下,make tmglib,会生成CLAPACK/tmglib_LINUX.a

编译blas CLAPACK目录下,make blaslib,会生成CLAPACK/blas_LINUX.a

最后是编译CLAPACKmake,会生成CLAPACK/lapack_LINUX.a

 

CLAPACK下的clapack.h就是所需要的头文件,除此之外还需要的一个头文件是F2CLIBS/f 2c .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>

using namespace std;

#include <F2CLIBS/f 2c .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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值