阿土,直接在代码:

#include <string>
#include "lapacke.h"
#include "lapack_aux.h" int main(int argc,char** argv)
{
setlocale(LC_ALL,"");
double a[] =
{
3,-1,-1,
4,-2,-1,
-3,2,1
};
int m = 3;
int n = 3;
int lda = 3;
int ipiv[3];
int info;
print_matrix("a",m,n,a,lda);
info = LAPACKE_dgetrf(LAPACK_ROW_MAJOR,m,n,a,lda,ipiv);
print_matrix("a",m,n,a,lda); info = LAPACKE_dgetri(LAPACK_ROW_MAJOR,m,a,lda,ipiv);
print_matrix("a",m,n,a,lda);
return 0;
}

输出结果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2lzZWxpdGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

也能够使用以下的方法:

#include <string>
#include "lapacke.h"
#include "lapack_aux.h" int main(int argc,char** argv)
{
setlocale(LC_ALL,"");
double a[] =
{
3,4,-3,
-1,-2,2,
-1,-1,1
}; int m = 3;
int n = 3;
int lda = 3;
int ipiv[3];
int info;
print_matrix("a",m,n,a,lda);
LAPACK_dgetrf(&m,&n,a,&lda,ipiv,&info);
print_matrix("a",m,n,a,lda); double *b = new double[m]();
//求普通矩阵的逆矩阵
LAPACK_dgetri(&m,a,&lda,ipiv,b,&n,&info);
print_matrix("inv(a)",m,n,a,lda);
return 0;
}

输出结果例如以下:

这样的方法的优点在于API接口的定义和相应的Fortran接口一致,比方dgetri,我们能够在双精度的函数说明(http://www.netlib.org/lapack/double/)文档中找到dgetri.f,打开这个Fortran文件,就能够知道相应的參数的含义了。

只是这里要注意存储矩阵时。两种方法之间的差别。第一种方法中,我们能够通过主序告诉lapack的接口我们的矩阵是以行为主序的,也就是在数组中,这个矩阵是按行存储的,对于一个3x3矩阵。输入的9个元素。前3个数是矩阵的第一行,紧接着是矩阵的第二行,最后是矩阵的第三行,而另外一种方法中,没有主序这个參数,研究发现,Fortran默认是以列为主序的,也就是说我们在用数组输入一个3x3矩阵时,前3个数表示第1列,再3个数为第2列,最后3个数为第3列。因此在给定矩阵的时候,我们须要按列输入。

因此方法2中的数组a,以列为主序,表示的矩阵实际上是这种:

     3    -1    -1
4 -2 -1
-3 2 1

这相当于把第一种方法中的主序改为LAPACK_COL_MAJOR,例如以下:

#include <string>
#include "lapacke.h"
#include "lapack_aux.h" int main(int argc,char** argv)
{
setlocale(LC_ALL,"");
double a[] =
{
3,4,-3,
-1,-2,2,
-1,-1,1
};
int m = 3;
int n = 3;
int lda = 3;
int ipiv[3];
int info;
print_matrix("a",m,n,a,lda);
info = LAPACKE_dgetrf(LAPACK_COL_MAJOR,m,n,a,lda,ipiv);
print_matrix("a",m,n,a,lda); info = LAPACKE_dgetri(LAPACK_COL_MAJOR,m,a,lda,ipiv);
print_matrix("a",m,n,a,lda);
return 0;
}

最后,我们在Matlab中验证一下,例如以下:

>>  a = [3,4,-3,-1,-2,2,-1,-1,1]

a =

     3     4    -3    -1    -2     2    -1    -1     1

>>  a = reshape(a,3,3)

a =

     3    -1    -1
4 -2 -1
-3 2 1 >> inv(a) ans = 0 1 1
1 0 1
-2 3 2

可见我们的计算结果好Matlab的结果一致。

附辅助函数:

#include <stdio.h>
#include "lapack_aux.h" /* Auxiliary routine: printing a matrix */
void print_matrix( char* desc, lapack_int m, lapack_int n, double* a, lapack_int lda )
{
lapack_int i, j;
printf( "\n %s\n", desc );
for( i = 0; i < m; i++ )
{
for( j = 0; j < n; j++ ) printf( " %6.2f", a[i*lda+j] );
printf( "\n" );
}
}

參考文件:

http://blog.csdn.net/kevinzhangyang/article/details/6859246

http://blog.csdn.net/daiyuchao/article/details/2026173

http://blog.csdn.net/daiyuchao/article/details/2026162

http://www.cnblogs.com/xunxun1982/archive/2010/05/12/1734001.html

http://www.cnblogs.com/xunxun1982/archive/2010/05/13/1734809.html

http://hi.baidu.com/data2009/item/50bce0704cf57a14d0dcb3e8

http://blog.sina.com.cn/s/blog_40b056950100htpt.html

http://blog.csdn.net/cleverysm/article/details/1925553

http://blog.csdn.net/cleverysm/article/details/1925549

http://www.cnblogs.com/Jedimaster/archive/2008/06/22/1227656.html

使用lapack图书馆逆矩阵的更多相关文章

  1. 360个人图书馆 轻松解除网页防复制 (转自老D)

    360个人图书馆会自动采集一些比较好的文章,我的博客文章也被采集过几篇,用过360个人图书馆的人都知道要复制别人的文章需要先收藏到自己的图书馆才可以复制,没有账号右键复制它会直接弹出一个提示登录框.不 ...

  2. c++实现矩阵类矩阵行列式,伴随矩阵,逆矩阵

    //Matrix ver1.0 //只支持矩阵内部(方阵)的运算 #include<iostream> #include<math.h> using namespace std ...

  3. ubuntu科学计算包blas和lapack的安装

    该包是高性能的线性代数计算库,两个包一般是相互依赖,因此选择同时介绍其安装: 官方发布如今是lacpack-3.5.0.tgz,获取方法是网址.但打不开,ubuntu一般用 wget http://w ...

  4. numpy.distutils.system_info.NotFoundError: no lapack/blas resources found

    python35用pip安装scipy的时候报错 numpy.distutils.system_info.NotFoundError: no lapack/blas resources found 原 ...

  5. 图书馆管理系统 SRS文档

    图书馆管理系统 SRS文档 编写人:魏晓 日期:2015年05月27日 1介绍 1.1编写目的 图书管理系统需求规格说明书是为了让系统的涉众就该系统的需求达成一致认可,明确该系统的需求,为后续的开发工 ...

  6. 图书馆管理系统UML建模

    一.    业务描述 1.借阅者:借书.还书 2.图书馆管理员:书籍借出处理   书籍归还处理书籍预定 3.系统管理员:增加书目.删除或更新书目.预定信息处理.增加书籍减少书籍.增加借阅者账户信息.删 ...

  7. python&MongoDB爬取图书馆借阅记录(没有验证码)

    题外话:这个爬虫本来是想用java完成然后发布在博客园里的,但是一直用java都失败了,最后看到别人用了python,然后自己就找别人问了问关键的知识点,发现连接那部分,python只用了19行!!! ...

  8. JS模式:简单的图书馆享元模式

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  9. Hark的数据结构与算法练习之图书馆排序

    算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...

随机推荐

  1. 给已有数据的oracle表建立外键关系

    PS:这里是给自己做个备忘,下次遇到同类问题的时候,方便查找: 客户在有主外键关系的2张表进行页面删除时报错已有子记录,运维后台处理的时候应该找出相应的数据,先删除子记录,在删主表记录:但客户要的急, ...

  2. 利用mysql5.6 的st_distance 实现按照距离远近排序。 (转载)

    http://blog.csdn.net/zhouzhiwengang/article/details/53612481

  3. amazeui学习笔记--css(常用组件1)--小徽章Badge

    amazeui学习笔记--css(常用组件1)--小徽章Badge 一.总结 1.am-badge:添加am-badge来声明小徽章对象 <span class="am-badge a ...

  4. 学习笔记:mpvue开发小程序——入门

    接下来可能要开发一个小程序,同事推荐使用mpvue,那么我提前熟悉下. 官网地址:http://mpvue.com/ 1.快速上手 http://mpvue.com/mpvue/quickstart/ ...

  5. HTTP--Request Headers及Cookies

    简介: HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST).如有必要,客户程序还可以选择发送其他的请求头.大多数请求头并不是必需的,但Content-L ...

  6. SimpleDateFormat的使用问题

    今天对过去的代码进行重构,因为使用静态方法调用的原因,使用了一个静态的SimpleDateFormat,结果FindBug报错了,查看了一下,说是使用了静态的SimpleDateFormat对象. S ...

  7. 洛谷——P1089 津津的储蓄计划

    https://www.luogu.org/problem/show?pid=1089 https://www.luogu.org/problem/show?pid=1089 题目描述 津津的零花钱一 ...

  8. [D3] Modify DOM Elements with D3 v4

    Once you can get hold of DOM elements you’re ready to start changing them. Whether it’s changing col ...

  9. Android 中AIDL的使用与理解

    AIDL的使用: 最常见的aidl的使用就是Service的跨进程通信了,那么我们就写一个Activity和Service的跨进程通信吧. 首先,我们就在AS里面新建一个aidl文件(ps:现在AS建 ...

  10. (转载)iis7下站点日志默认位置

    转自http://www.cnblogs.com/mincyw/p/3425468.html iis7下站点日志默认位置   在iis6时,通过iis管理器的日志配置可以找到站点日志存储的位置. 但是 ...