TOJ5272: 逆矩阵
5272: 逆矩阵 
Total Submit: 11 Accepted:7
Description
设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得:AB=BA=E(单位矩阵)。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。
现在告诉你一个n阶方阵A,求它的逆矩阵B。


Input
输入数据有多组,第一行为数据组数T,接下来有T个矩阵。
每个矩阵的第一行为n(n<20),表示n阶方阵,接下来的n行n列表示n*n的矩阵
矩阵元素为实数。
Output
按照n行n列输出逆矩阵B,所有元素保留2位小数。数据保证一定有逆矩阵。
Sample Input
1
5
1.3 0.8 0.5 0.8 1.0
0.5 0.6 1.0 1.3 1.0
0.8 1.4 0.9 1.1 1.4
1.0 0.6 0.8 1.4 0.5
0.7 0.6 1.4 1.4 1.2
Sample Output
0.86 -1.37 -0.36 0.37 0.69
-1.10 -1.90 1.71 0.93 0.12
-1.08 -4.01 0.72 0.64 3.14
0.01 3.06 -0.61 0.33 -1.99
1.29 2.85 -0.77 -1.81 -0.97
Source
矩阵的逆,我提供了两种方法。
LU分解
#include<stdio.h>
const int N=;
double a[N][N],b[N][N],c[N][N],bt[N][N],ct[N][N],ans[N][N];
int T,n;
void LU()
{
for(int i=; i<n; i++)
for(int j=; j<n; j++)b[i][j]=c[i][j]=bt[i][j]=ct[i][j]=ans[i][j]=;
for(int i=; i<n; i++)b[i][i]=bt[i][i]=;
double s;
for(int i=; i<n; i++)
{
for(int j=i; j<n; j++)
{
s=;
for(int k=; k<i; k++)
s+=b[i][k]*c[k][j];
c[i][j]=a[i][j]-s;
}
for(int j=i+; j<n; j++)
{
s=;
for(int k=; k<i; k++)
s+=b[j][k]*c[k][i];
b[j][i]=(a[j][i]-s)/c[i][i];
}
}
for(int i=; i<n; i++)
for(int j=; j<i; j++)
{
s=;
for(int k=; k<i; k++)
s+=b[i][k]*bt[k][j];
bt[i][j]=-s;
}
for(int i=; i<n; i++)
ct[i][i]=/c[i][i];
for(int i=; i<n; i++)
for(int j=i-; j>=; j--)
{
s=;
for(int k=j+; k<=i; k++)
s+=c[j][k]*ct[k][i];
ct[j][i]=-s/c[j][j];
}
for(int i=; i<n; i++)
for(int j=; j<n; j++)
for(int k=; k<n; k++)
ans[i][j]+=ct[i][k]*bt[k][j];
for(int i=; i<n; i++)
for(int j=; j<n; j++)printf("%.2f%c",ans[i][j],j==n-?'\n':' ');
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=; i<n; i++)
for(int j=; j<n; j++)
scanf("%lf",&a[i][j]);
LU();
}
return ;
}
Gauss 消元
#include<stdio.h>
#include<math.h>
#include<algorithm>
const double eps=1e-;
const int N=;
double a[N][N],b[N],x[N],s,t[N][N],ans[N][N];
int n;
void gauss()
{
int i;
for(int k=; k<=n; k++)
{
for(i=k; i<=n&&fabs(a[i][k])<eps; i++);
if(i!=k)
{
for(int j=k; j<=n; j++)std::swap(a[i][j],a[k][j]);
std::swap(b[i],b[k]);
}
for(i=k+; i<=n; i++)
{
s=a[i][k]/a[k][k];
for(int j=k; j<=n; j++)a[i][j]-=a[k][j]*s;
b[i]-=b[k]*s;
}
}
for(i=n; i>=; --i)
{
s=b[i];
for(int j=i+; j<=n; j++)s-=x[j]*a[i][j];
x[i]=s/a[i][i];
if(fabs(x[i])<eps)x[i]=;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
scanf("%lf",&t[i][j]),a[i][j]=t[i][j];
b[i]=;
}
for(int k=; k<=n; k++)
{
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)a[i][j]=t[i][j];
b[i]=;
}
b[k]=;
gauss();
for(int i=; i<=n; i++)ans[i][k]=x[i];
}
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)printf("%.2f%c",ans[i][j],j==n?'\n':' ');
}
return ;
}
TOJ5272: 逆矩阵的更多相关文章
- c++实现矩阵类矩阵行列式,伴随矩阵,逆矩阵
//Matrix ver1.0 //只支持矩阵内部(方阵)的运算 #include<iostream> #include<math.h> using namespace std ...
- BZOJ 3640 JC的小苹果(逆矩阵)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...
- 《Linear Algebra and Its Applications》-chaper3-行列式-从一个逆矩阵算法证明引入的行列式
这一章节开始介绍线性代数中另外一个基本概念——行列式. 其实与矩阵类似,行列式也是作为简化表述多项式的一种工具,关于行列式的历史渊源,有如下的介绍. 在介绍逆矩阵的时候,我们曾提及二阶矩阵有一个基于矩 ...
- 学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵
线性代数,面向连续数学,非离散数学.<The Matrix Cookbook>,Petersen and Pedersen,2006.Shilov(1977). 标量.向量.矩阵.张量. ...
- 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理
浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...
- 使用cv::invert()求解Mat矩阵的逆矩阵
opencv中cv::invert()可直接用来求解矩阵的逆矩阵 函数原型如下: double cv::invert(InputArray src, OutputArray dst, int fl ...
- matlab中求逆矩阵的高斯消元法实现的代码
function qiuni =INV_GET(a)N=length(a);M=eye(N);%得到上三角矩?for i=1:N max=a(i,i); A=i; for j=i+1:N if(abs ...
- 求伪逆矩阵c++代码(Eigen库)
非方阵的矩阵的逆矩阵 pseudoInverse 伪逆矩阵是逆矩阵的广义形式,广义逆矩阵 matlab中是pinv(A)-->inv(A). #include "stdafx.h&q ...
- 使用lapack图书馆逆矩阵
阿土,直接在代码: #include <string> #include "lapacke.h" #include "lapack_aux.h" i ...
随机推荐
- Mac Office 2016 卸载
https://support.office.com/zh-cn/article/%E5%8D%B8%E8%BD%BD-Office-2016-for-Mac-eefa1199-5b58-43af-8 ...
- IOS enum(枚举)使用
typedef enum { MJMessageTypeMe=, MJMessageTypeOther }MJMessageType; /** *信息的类型 * */ @property (nonat ...
- 利用Python实现 队列的算法
以下内容都是来自“悟空“大神的讲解,听他的视频课,利用Python实现堆栈的算法,自己做了一些小总结,可能会存在自己理解的一些误区, 1.栈的实现 队列的特征是先进先出,同我们生活中的队列具有相同的特 ...
- OpenLayers学习笔记2——坐标转换问题
参照别人的添加marker的demo来改造时,发现无论怎样更改经纬度,都是停留在同一个位置.过了一两天突然想起可能是坐标参考的问题,尝试搜了一下,果然是这个问题.问题是这样子的: WMTS中地图的坐标 ...
- 感谢我的python老师
Python自动化开发(金角大王版) http://www.cnblogs.com/alex3714/articles/5885096.html
- 漫谈 Clustering (番外篇): Expectation Maximization
Expectation Maximization (EM) 是一种以迭代的方式来解决一类特殊最大似然 (Maximum Likelihood) 问题的方法,这类问题通常是无法直接求得最优解,但是如果引 ...
- iOS 控制section不悬停 --- iOS开发系列 ---项目中成长的知识八
一般情况下,tableview中的section是会默认不随着tableview的滚动而滚动的,而是会等到属于这个section的cell滑完过后,然后往上顶(不知道大家能不能听懂=_=!) 有些时候 ...
- 一步一步讲解安装NodeJs开发环境
node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node. ...
- IE console报错
需要注意的是,使用console对象查看对象信息,在IE8浏览器下未打开开发人员工具(F12)的情况下 会报'console'未定义错误. 解决办法:1.打开开发人员调试工具(F12) ...
- 二 python并发编程之多进程-理论
一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的任务,写书的任 ...