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 ;
}

TOJ5272: 逆矩阵的更多相关文章

  1. c++实现矩阵类矩阵行列式,伴随矩阵,逆矩阵

    //Matrix ver1.0 //只支持矩阵内部(方阵)的运算 #include<iostream> #include<math.h> using namespace std ...

  2. BZOJ 3640 JC的小苹果(逆矩阵)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...

  3. 《Linear Algebra and Its Applications》-chaper3-行列式-从一个逆矩阵算法证明引入的行列式

    这一章节开始介绍线性代数中另外一个基本概念——行列式. 其实与矩阵类似,行列式也是作为简化表述多项式的一种工具,关于行列式的历史渊源,有如下的介绍. 在介绍逆矩阵的时候,我们曾提及二阶矩阵有一个基于矩 ...

  4. 学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵

    线性代数,面向连续数学,非离散数学.<The Matrix Cookbook>,Petersen and Pedersen,2006.Shilov(1977). 标量.向量.矩阵.张量. ...

  5. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  6. 使用cv::invert()求解Mat矩阵的逆矩阵

    opencv中cv::invert()可直接用来求解矩阵的逆矩阵 函数原型如下: double cv::invert(InputArray  src, OutputArray dst, int  fl ...

  7. 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 ...

  8. 求伪逆矩阵c++代码(Eigen库)

    非方阵的矩阵的逆矩阵  pseudoInverse 伪逆矩阵是逆矩阵的广义形式,广义逆矩阵 matlab中是pinv(A)-->inv(A). #include "stdafx.h&q ...

  9. 使用lapack图书馆逆矩阵

    阿土,直接在代码: #include <string> #include "lapacke.h" #include "lapack_aux.h" i ...

随机推荐

  1. <已解决> Eclipse启动失败

    参考:http://stackoverflow.com/questions/15404964/starting-eclipse-results-in-failed-to-create-java-vir ...

  2. warning: remote HEAD refers to nonexistent ref, unable to checkout.解决

    git branch -r origin/branch origin/hexo git checkout -b hexo origin/hexo

  3. python_29_三级菜单2

    menu={'河北':{ '石家庄':{ '平山':{ '县城':{}, '寨北':{}, '苏家庄':{}, }, '灵寿':{}, '鹿泉':{} }, }, '北京':{ '昌平':{ '沙河' ...

  4. Oracle 数据处理

    1. 对维度按照度量值的排名进行统计得分,第一名100分,第二名99分,第三名98……可以先进行排名,然后用 得分值+1,减去排名既是所得分数. -- 建表 create table province ...

  5. 博学谷-数据分析pandas

    import pandas as pd df=pd.read_csv() df=pd.read_sql()

  6. java面向对象思想1

    1.面向对象是面向过程而言.两者都是一种思想.面向过程:强调的是功能行为.(强调过程.动作)面向对象:将功能封装进对象,强调了具备了功能的对象.(强调对象.事物)面向对象是基于面向过程的.将复杂的事情 ...

  7. 微信小程序的开发——01小程序的执行流程是怎样的?

    作者:叶小钗 转载至:https://www.cnblogs.com/yexiaochai/p/9346043.html 我们这边最近一直在做基础服务,这一切都是为了完善技术体系,这里对于前端来说便是 ...

  8. mysql 绿色版 安装

    1.下载mysql的绿色版压缩包.(自行百度) 2.自行规划目录解压 3.安装 注意:我遇到的两种版本的安装方法(暂时按照解压后的目录中是否含有data目录来区分) 3.1 无data目录(我用到的的 ...

  9. 微信小游戏 demo 飞机大战 代码分析 (一)(game.js, main.js)

    微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

  10. 网络编程-osi七层

    一.操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才 ...