LAPACK的C/C++接口及代码实例

今天介绍一个矩阵处理工具LAPACK,她有C\C++接口,可在windows下移植。本人最近正在学习,发现还是还不错滴~

本博文分为三部分,第一部分介绍LAPACK的安装,这里只介绍最简单的部署;第二部分介绍LAPACK的运用,举出例子并附上代码,第三部分介绍代码。

1、最简单的安装

http://icl.cs.utk.edu/lapack-for-windows/lapack/LAPACKE_examples.zip下载,里面已经配置好库和坏境,并且有两个例子。假如你想自己编程序,可以修改之前的源文件。当然这种方法有很大的缺陷,就是她的库有限,以后会介绍怎么使用VS和Cmake编译LAPACK,这里只让大伙有个简单的认识。

2、代码实例

我们举个最小二乘的例子。A*x=B,由A和B求解出x,一般是超定方程组的解。

求解思路:A'Ax=A'B >> X=(A'A)'A'B。'表示转置。

/* Calling DGELS using row-major order */

#include 
    
    
     
     
#include 
     
     
      
      

int main (int argc, const char * argv[])
{
   double a[5][3] = {1,1,1,2,3,4,3,5,2,4,2,5,5,4,3};
   double b[5][2] = {-10,-3,12,14,14,12,16,16,18,16};
   lapack_int info,m,n,lda,ldb,nrhs;
   int i,j;

   m = 5;
   n = 3;
   nrhs = 2;
   lda = 3;
   ldb = 2;

   info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*b,ldb);

   for(i=0;i
      
      
     
     
    
    
结果展示:


3、代码介绍

double a[5][3] = {1,1,1,2,3,4,3,5,2,4,2,5,5,4,3};
double b[5][2] = {-10,-3,12,14,14,12,16,16,18,16};

这两行生成两个二维数组,一个是5行3列,另一个是5行2列,并赋值。

lapack_int info,m,n,lda,ldb,nrhs;
int i,j;

m = 5;
n = 3;
nrhs = 2;
lda = 3;
ldb = 2;

相比c/c++,LAPACK的数据类型申请要加前缀或者后缀,比如lapack_int。

这里主要对后面程序所要用到的数据进行类型定义,然后赋值,类似opencv中定义的数

据类型。

info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*b,ldb);

这行代码是本程序的精髓,LAPACK接口函数处理lapack_int类型的数据,设置处理后的

返回给info。

LAPACK函数名定义的一般形式:LAPACKE_xbase 或者LAPACKE_xbase_work,x表示类型,

s和d分别表示单精度和双精度的实数,c和z分别表示单精度和双精度的复数;base表示

函数,函数的原型在lapack.h中有详细的介绍,大家可以根据自己所要完成的功能寻找

相关的函数。大概有这些函数:

//real function
bdsdc bdsqr disna gbbrd gbcon gbequ gbequb gbrfs gbrfsx gbsv gbsvx gbsvxx gbtrf
gbtrs gebak gebal gebrd gecon geequ geequb gees geesx geev geevx gehrd gejsv
gelqf gels gelsd gelss gelsy geqlf geqp3 geqpf geqrf geqrfp gerfs gerfsx gerqf
gesdd gesv gesvd gesvj gesvx gesvxx getrf getri getrs ggbak ggbal gges ggesx
ggev ggevx ggglm gghrd gglse ggqrf ggrqf ggsvd ggsvp gtcon gtrfs gtsv gtsvx
gttrf gttrs hgeqz hsein hseqr opgtr opmtr orgbr orghr orglq orgql orgqr orgrq
orgtr ormbr ormhr ormlq ormql ormqr ormrq ormrz ormtr pbcon pbequ pbrfs pbstf
pbsv pbsvx pbtrf pbtrs pftrf pftri pftrs pocon poequ poequb porfs porfsx posv
posvx posvxx potrf potri potrs ppcon ppequ pprfs ppsv ppsvx pptrf pptri pptrs
pstrf ptcon pteqr ptrfs ptsv ptsvx pttrf pttrs sbev sbevd sbevx sbgst sbgv
sbgvd sbgvx sbtrd sfrk spcon spev spevd spevx spgst spgv spgvd spgvx sprfs spsv
spsvx sptrd sptrf sptri sptrs stebz stedc stegr stein stemr steqr sterf stev
stevd stevr stevx sycon syequb syev syevd syevr syevx sygst sygv sygvd sygvx
syrfs syrfsx sysv sysvx sysvxx sytrd sytrf sytri sytrs tbcon tbrfs tbtrs tfsm
tftri tfttp tfttr tgevc tgexc tgsen tgsja tgsna tgsyl tpcon tprfs tptri tptrs
tpttf tpttr trcon trevc trexc trrfs trsen trsna trsyl trtri trtrs trttf trttp
tzrzf

//complex function
bdsqr gbbrd gbcon gbequ gbequb gbrfs gbrfsx gbsv gbsvx gbsvxx gbtrf gbtrs gebak
gebal gebrd gecon geequ geequb gees geesx geev geevx gehrd gelqf gels gelsd
gelss gelsy geqlf geqp3 geqpf geqrf geqrfp gerfs gerfsx gerqf gesdd gesv gesvd
gesvx gesvxx getrf getri getrs ggbak ggbal gges ggesx ggev ggevx ggglm gghrd
gglse ggqrf ggrqf ggsvd ggsvp gtcon gtrfs gtsv gtsvx gttrf gttrs hbev hbevd
hbevx hbgst hbgv hbgvd hbgvx hbtrd hecon heequb heev heevd heevr heevx hegst
hegv hegvd hegvx herfs herfsx hesv hesvx hesvxx hetrd hetrf hetri hetrs hfrk
hgeqz hpcon hpev hpevd hpevx hpgst hpgv hpgvd hpgvx hprfs hpsv hpsvx hptrd
hptrf hptri hptrs hsein hseqr pbcon pbequ pbrfs pbstf pbsv pbsvx pbtrf pbtrs
pftrf pftri pftrs pocon poequ poequb porfs porfsx posv posvx posvxx potrf potri
potrs ppcon ppequ pprfs ppsv ppsvx pptrf pptri pptrs pstrf ptcon pteqr ptrfs
ptsv ptsvx pttrf pttrs spcon sprfs spsv spsvx sptrf sptri sptrs stedc stegr
stein stemr steqr sycon syequb syrfs syrfsx sysv sysvx sysvxx sytrf sytri sytrs
tbcon tbrfs tbtrs tfsm tftri tfttp tfttr tgevc tgexc tgsen tgsja tgsna tgsyl
tpcon tprfs tptri tptrs tpttf tpttr trcon trevc trexc trrfs trsen trsna trsyl
trtri trtrs trttf trttp tzrzf ungbr unghr unglq ungql ungqr ungrq ungtr unmbr
unmhr unmlq unmql unmqr unmrq unmrz unmtr upgtr upmtr

LAPACK_ROW_MAJOR,行优先,即对矩阵的处理的过程中,是按行处理的。

'N',没有进行转置。

m,n,nrhs,m表示两个矩阵的行,n表示x的行,nrhs表示x的列。A*x=B。

*a,lda,分别表示矩阵A的指针和列数。

*b,ldb,分别表示矩阵B的指针和列数。

for(i=0;i
    
    
打印输出,并返回info。


好了大家现在对LAPACK有了初步的认识,假如你想深入学习,请浏览一下网页:

http://netlib.org/lapack/lapacke.html

http://icl.cs.utk.edu/lapack-for-windows/lapack/


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要使用 MPI 实现多线程并行矩阵求逆,可以按照以下步骤: 1. 将矩阵分配给不同的进程。每个进程将负责处理矩阵的一部分。 2. 在每个进程中使用线程来计算矩阵的逆。可以使用线性代数库,如 LAPACK 或 BLAS 来进行矩阵计算。 3. 将每个进程计算得到的逆矩阵发送回主进程。 4. 在主进程中组合所有的逆矩阵,得到完整的逆矩阵。 以下是一个简单的示例代码: ```c++ #include <mpi.h> #include <iostream> #include <cmath> #include <cstring> #include <cstdlib> #include <cstdio> #include <cstring> #include <ctime> #include "lapacke.h" using namespace std; int main(int argc, char *argv[]) { int rank, size; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int n = 4; // 矩阵维度 double *A = new double[n * n]; // 矩阵数据 double *Ainv = new double[n * n]; // 逆矩阵数据 // 初始化矩阵 if (rank == 0) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { A[i * n + j] = i + j; } } } // 广播矩阵数据到所有进程 MPI_Bcast(A, n * n, MPI_DOUBLE, 0, MPI_COMM_WORLD); // 每个进程计算矩阵逆 int m = n / size; double *Ainv_part = new double[m * n]; // 逆矩阵部分数据 memset(Ainv_part, 0, m * n * sizeof(double)); int info; int *ipiv = new int[n]; int lda = n, ldb = n, lwork = n * n; double *work = new double[lwork]; LAPACK_dgetrf(&n, &n, A, &lda, ipiv, &info); if (info == 0) { for (int i = 0; i < m; ++i) { LAPACK_dgetri(&n, A + rank * m * n + i * n, &lda, ipiv, work, &lwork, &info); memcpy(Ainv_part + i * n, A + rank * m * n + i * n, n * sizeof(double)); } } delete[] ipiv; delete[] work; // 收集每个进程的逆矩阵部分数据 MPI_Gather(Ainv_part, m * n, MPI_DOUBLE, Ainv, m * n, MPI_DOUBLE, 0, MPI_COMM_WORLD); // 在主进程中输出逆矩阵 if (rank == 0) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << Ainv[i * n + j] << " "; } cout << endl; } } delete[] A; delete[] Ainv; delete[] Ainv_part; MPI_Finalize(); return 0; } ``` 在此示例中,每个进程都计算矩阵的逆,并将其部分结果发送回主进程。主进程将所有部分结果组合成完整的逆矩阵,并输出到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值