使用lapack图书馆逆矩阵
阿土,直接在代码:
#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图书馆逆矩阵的更多相关文章
- 360个人图书馆 轻松解除网页防复制 (转自老D)
360个人图书馆会自动采集一些比较好的文章,我的博客文章也被采集过几篇,用过360个人图书馆的人都知道要复制别人的文章需要先收藏到自己的图书馆才可以复制,没有账号右键复制它会直接弹出一个提示登录框.不 ...
- c++实现矩阵类矩阵行列式,伴随矩阵,逆矩阵
//Matrix ver1.0 //只支持矩阵内部(方阵)的运算 #include<iostream> #include<math.h> using namespace std ...
- ubuntu科学计算包blas和lapack的安装
该包是高性能的线性代数计算库,两个包一般是相互依赖,因此选择同时介绍其安装: 官方发布如今是lacpack-3.5.0.tgz,获取方法是网址.但打不开,ubuntu一般用 wget http://w ...
- numpy.distutils.system_info.NotFoundError: no lapack/blas resources found
python35用pip安装scipy的时候报错 numpy.distutils.system_info.NotFoundError: no lapack/blas resources found 原 ...
- 图书馆管理系统 SRS文档
图书馆管理系统 SRS文档 编写人:魏晓 日期:2015年05月27日 1介绍 1.1编写目的 图书管理系统需求规格说明书是为了让系统的涉众就该系统的需求达成一致认可,明确该系统的需求,为后续的开发工 ...
- 图书馆管理系统UML建模
一. 业务描述 1.借阅者:借书.还书 2.图书馆管理员:书籍借出处理 书籍归还处理书籍预定 3.系统管理员:增加书目.删除或更新书目.预定信息处理.增加书籍减少书籍.增加借阅者账户信息.删 ...
- python&MongoDB爬取图书馆借阅记录(没有验证码)
题外话:这个爬虫本来是想用java完成然后发布在博客园里的,但是一直用java都失败了,最后看到别人用了python,然后自己就找别人问了问关键的知识点,发现连接那部分,python只用了19行!!! ...
- JS模式:简单的图书馆享元模式
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- Hark的数据结构与算法练习之图书馆排序
算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...
随机推荐
- Java缓存组件 EhCache 入门教程
1.技术背景: 系统缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.缓存设想内存是有限的,缓存的时效性也是有 ...
- Java Web学习总结(6)——通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 package gacl.res ...
- Android 使用JSON格式与服务器交互 中文乱码问题解决
当前是在开发Android 程序时,客户端与服务器端采用JSON传送数据,发现中文乱码问题.不过这个问题的解决办法应该对所有java语言开发的项目都使用. 解决方法是: 1.客户端发送数据之间加上: ...
- HDU - 3341 Lost's revenge(AC自己主动机+DP)
Description Lost and AekdyCoin are friends. They always play "number game"(A boring game b ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- oracle高效分页存储过程(百万数据级)
create or replace procedure Pager( page in number,--数据页数,从1开始 pageSize in number,--每页大小 tableName nv ...
- UVA Bandwidth
题目例如以下: Bandwidth Given a graph (V,E) where V is a set of nodes and E is a set of arcsin VxV, and a ...
- 一次性能优化将filter转换
有一条SQL性能有问题,在运行计划中发现filter.遇到它要小心了,类似于nestloop.我曾经的blog对它有研究探索运行计划中filter的原理.用exists极易引起filter. 优化前: ...
- swift开发网络篇 - post 请求
/** 所有网络请求,统一使用异步请求! 在今后的开发中,如果使用简单的get/head请求,可以用NSURLConnction异步方法 GET查/POST增/PUT改/DELETE删/HEAD GE ...
- Java反射学习总结二(用反射调用对象的私有属性和方法)
大家都知道正常的调用是不可以访问对象的private修饰的属性和方法的,这也是Java的封装性原则. 但是有没有方法可以强制去访问对象的private修饰的属性和方法呢?那就是用反射!(这个可能在面试 ...