使用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的数据结构与算法练习之图书馆排序
算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...
随机推荐
- docker中发布springboot
http://note.youdao.com/noteshare?id=81a603b1b33731aaef7b7755c70f33fb
- HTTP网络协议(五)
主动攻击:是指攻击通过直接访问Web应用,把攻击代码传入的攻击模式,该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源,例如:SQL注入攻击和OS命令注入攻击. 被动攻击:是指 ...
- Library Component Properties的表格如何填写
- VMware Ubuntu安装详细过程(详细图解)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.下载Ubuntu镜像文件 下载地址:http://mirrors.aliyun.com/ubuntu-releases/16. ...
- php课程 10-34 目录遍历中的注意事项是什么
php课程 10-34 目录遍历中的注意事项是什么 一.总结 一句话总结:用scandir,会把目录和文件放到一个数组中. 1.移动文件怎么实现,php里面没有移动文件这个函数? 先复制,再删除 2 ...
- Python 在线笔试
1. 循环输入输出交互 Python在线笔试琐碎 求两个整数 A+B 的和. while True: try: (n, m) = (int(x) for x in raw_input().split( ...
- Web安全之Cookie劫持
1. Cookie是什么? 2. 窃取的原理是什么? 3. 系统如何防Cookie劫持呢? 看完这三个回答, 你就明白哪位传奇大侠是如何成功的!!! Cookie: HTTP天然是无状态的协议, 为了 ...
- 【微信小程序】自定义模态框实例
原文链接:https://mp.weixin.qq.com/s/23wPVFUGY-lsTiQBtUdhXA 1 概述 由于官方API提供的显示模态弹窗,只能简单地显示文字内容,不能对对话框内容进行自 ...
- signature.html
原文网址:http://www.youdzone.com/signature.html 阮一峰:http://www.ruanyifeng.com/blog/2011/08/what_is_a_d ...
- 基于Maven,Spring+ActiveMQ实现,贴近实际
本文只实现了Topic,queue改点配置就行了 一.pom依赖 Spring的太长了,具体可以看下面源码里面 <dependency> <groupId>org.apache ...