今天介绍一个矩阵处理工具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/