5272: 逆矩阵 

Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte
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 ;
}

最新文章

  1. HTML中使用javascript解除禁止input输入框代码:
  2. C# XML操作
  3. CTSC&amp;&amp;APIO 2015 酱油记
  4. [Node.js] Node + Redis 实现分布式Session方案
  5. yum -------包安装库
  6. E - Minimum Cost - POJ 2516(最小费)
  7. javascript写贪吃蛇游戏(20行代码!)
  8. 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件
  9. JUI/DWZ介绍、简单使用
  10. Final Cut Pro X for Mac(FCPX专业视频剪辑工具)实用技巧篇!
  11. 交叉编译7zip过程
  12. 微信小程序-查询快递
  13. ubuntun 18.04 安装和配置mysql数据库
  14. python 使用gevent模块实现手动挡切换多协程。
  15. Servlet-转发和重定向的区别
  16. rook 入门理解
  17. Nginx+upstream针对后端服务器容错的运维笔记
  18. selenium在scrapy中的应用
  19. Windows Mobile设备操作演示准备工作小记
  20. How to properly set clock speed for STM32F4xx devices

热门文章

  1. DDL与DML语句
  2. Sonar服务器搭建
  3. win8.1和wp8.1共用代码,需要注意的一些问题
  4. .net reflector 的缺陷
  5. 【转】iOS开发4:关闭键盘
  6. Java 发送 Http请求工具类
  7. Github的基本功能
  8. PAT (Basic Level) Practise (中文)- 1003. 我要通过!(20)
  9. js call 函数
  10. PAT 乙级 1059