使用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" >

也能够使用以下的方法:

#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

时间: 2024-08-05 06:14:37

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

使用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

CentOS7系统上的LAPACK源码安装

参考链接:linux下安装blas和lapack BLAS 和 LAPACK 这两个数学库是很多 Linux 科学计算软件需要调用的,所以经常会用到. LAPACK,其名为Linear Algebra PACKage的缩写,是一以Fortran编程语言编写,用于数值计算的函式集.LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式.线性系统方程组的最小平方解.计算特征向量.用于计算矩阵QR分解的Householder转换.以及奇异值分解等问题. LAPACK的源码可以从http://ww

图书馆管理系统(C语言实现)

源代码在这里 1   图书馆管理系统(C语言实现). 2  功能相对简单, 增删改查而已. 3  详细的介绍都在链接里了.

图书馆排序(Library Sort)

思路简介,大概意思是说,排列图书时,如果在每本书之间留一定的空隙,那么在进行插入时就有可能会少移动一些书,说白了就是在插入排序的基础上,给书与书之间留一定的空隙,这个空隙越大,需要移动的书就越少,这是它的思路,用空间换时间 看红线标的那句话知道,这个空隙留多大,你自己定 图书馆排序的关键是分配空间,分配完空间后直接使用插入排序即可 进行空间分配的过程 这个我实在是找不到相关的资料,没准就是平均分配嘞 进行插入排序的过程 举例待排数组[ 0 0 6 0 0 2 0 0 4 0 0 1 0 0 5 

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

该包是高性能的线性代数计算库,两个包一般是相互依赖,因此选择同时介绍其安装: 官方发布如今是lacpack-3.5.0.tgz,获取方法是网址.但打不开,ubuntu一般用 wget http://www.netlib.org/lapack/lapack-3.5.0.tgz 下载后解压 tar -zxvf lapack-3.5.0.tgz 在make之前,需要先创建一个make.inc文件,可以直接根据make.inc.example创建: cd lapack-3.5.0 cp make.inc

图书馆管理系统——模板建立

图书馆管理系统也进行了有一段时日了,前段时间一直在进行画图,直到前天才真正的把图画完,当然后期肯定还有需要完善的地方.现阶段,我们就开始了界面的搭建,这个对于我们来说既是熟悉的,同时也是具有挑战性的.为什么这么说呢? 熟悉的是我们学习BS的第一个项目就是牛腩新闻发布系统,这个项目就是从代码到界面搭建,整合等项目的全套学习,我们的图书馆管理系统基本上都是这里面所讲到过的,对于我们来说都不陌生.但是,对于自己来说,当时学习牛腩视频的时候,基本上都是看着视频进行敲的,有很多地方不太理解,虽然功能或者样

图书馆

// //  Book.h //  lanou // //  Created by lanou3g on 15/4/29. //  Copyright (c) 2015年 lanou3g. All rights reserved. // #import <Foundation/Foundation.h> @interface Book : NSObject { NSString * _bookName;//图书名字 NSString * _bookAuther;//图书作者 NSString

利用jsoup解析个人信息----图书馆客户端

上一篇HTTPclient模拟登陆交大图书馆解决了登陆,登陆之后便可以查看个人信息.个人信息条目较少,如图: 主要就是:姓名.电话.目前借书.积欠金额. 查看其html代码: 下面开始进行解析: 代码 package com.ali.login.spider; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import com.ali.login.bean.Us

公益图书馆-UserController-代码学习

1.我的捐书信息 /** * @author Edwin * @description 显示捐书信息 */ public function donate() { $BookDB = D('Book'); //获取BOOK数据表对象,实例化 $id = session('user')['id']; //获取当前用户id信息,比如我的id是73 $where['contributor_id'] = $id; //contributor_id = $id为查询条件 $count = $BookDB->