矩阵求逆代码

原创 2009年12月11日 23:01:00
矩阵求逆代码

 

感觉线性代数作业里一直少不了矩阵求逆,

写个带输出算逆矩阵的步骤的矩阵求逆程序,希望给即将或正在学线代的同学一点方便。

代码写的不好,大家见谅。

/* ==================================
 *
 *  Copyright (C) Bill Hsu 
 *   
http://hi.baidu.com/probill
 *  2009-12-11
 **********************************
*/
#include  
< iostream >
#include  
< vector >
#include  
< math.h >
using     namespace   std;

typedef vector  
< float >   s_line;  //  用来表示一行
s_line line;

typedef vector  
< s_line >   s_matrix;  //  用来表示一个矩阵
s_matrix matrix;
s_matrix mat;
int   nSize;  //  矩阵维数
int   nSign;  //  标记行列式正负
void   outprint(s_matrix  &   _mat);
void   printstep(s_matrix  &   _mat);
int   step  =   0  ;
void   line_add(s_matrix  &   _mat,  int   a,  int   b,  float   k  =   1.0f  )  //  第b行乘k加到第a行
{
int   size  =  _mat[  0  ].size();

for  (  int   i  =   0  ;i  <  size;  ++  i)
{
_mat[a][i] 
+=  _mat[b][i]  *  k;

//  end for
}



void   work1(s_matrix  &   _mat)  //  主计算函数
{

for  (  int   i  =   1  ;i  <  nSize;  ++  i)
{

if  (fabs(_mat[i  -   1  ][i  -   1  ])  <   0.000001 )
{
int   mm;
for  (mm  =  i;mm  <  nSize;  ++  mm)
{
if  (fabs(_mat[mm  -   1  ][i  -   1  ])  >   0.000001  )   break  ;
//  end for
line_add(_mat,i  -   1  ,mm  -   1  );
//  end if

for  (  int   j  =  i;j  <  nSize;  ++  j)
{
line_add(_mat,j,i 
-   1  ,  -  _mat[j][i  -   1  ]  /  _mat[i  -   1  ][i  -   1  ]);

//  end for j
printstep(_mat);
//  end for i

}


void   work2(s_matrix  &   _mat)  //  第二部计算
{
for  (  int   i  =  nSize  -   2  ;i  >=   0  ;  --  i)
{
for  (  int   j  =  i;j  >=   0  ;  --  j)
{
line_add(_mat,j,i 
+   1  ,  -  _mat[j][i  +   1  ]  /  _mat[i  +   1  ][i  +   1  ]);
}
printstep(_mat);
}

}


void   makeunit(s_matrix  &   _mat)  //  单位化
{

mat.clear();

for  (  int   i  =   0  ;i  <  nSize;  ++  i)
{
line.clear();
for  (  int   j  =   0  ;j  <  nSize  *   2  ;  ++  j)
{
float   tmp  =  _mat[i][j]  /  _mat[i][i];
if  (fabs(tmp)  <   0.000001  ) tmp  =   0  ;
line.push_back(tmp);
}
mat.push_back(line);
//  cout<<endl;
}
_mat 
=  mat;
}

void   printstep(s_matrix  &   _mat)  //  显示求的过程
{
cout 
<<   "  第   "   <<++  step  <<   "  步  "   <<  endl;
for  (  int   i  =   0  ;i  <  nSize;  ++  i)
{

for   (  int   j  =   0  ;j  <   2   *  nSize;  ++  j)
{
if  (fabs(_mat[i][j])  <   0.000001 ) _mat[i][j]  =   0  ;
cout 
<<  _mat[i][j]  <<   "     "  ;
if  (j  ==  nSize  -   1  )cout   <<   "   |   "  ;
}
cout 
<<  endl;
}
cout 
<<  endl;

}

void   outprint(s_matrix  &   _mat)  //  输出函数
{
for  (  int   i  =   0  ;i  <  nSize;  ++  i)
{

for   (  int   j  =  nSize;j  <   2   *  nSize;  ++  j)
{
cout 
<<  _mat[i][j]  <<   "     "  ;
}
cout 
<<  endl;
}


}

int   main()
{
step 
=   0  ;
matrix.clear();
line.clear();
cout 
<<   "  *********矩阵 求逆*********  "   <<  endl;
cout 
<<   "  *********Bill  Hsu*********  "   <<  endl;
cout 
<<   "  http://hi.baidu.com/probill  "   <<  endl  <<  endl;

cout 
<<   "  请输入矩阵维数(输入0退出):  "  ; 
cin 
>>  nSize;
if  (nSize  <=   0  )   return     0  ;
for  (  int   i  =   0  ;i  <  nSize;  ++  i)
{
line.clear(); 
cout 
<<   "  输入第  "   <<  i  +   1   <<   "   行:   "   <<  endl;
for   (  int   j  =   0  ;j  <  nSize;  ++  j) 
{
float   tmp;
cin 
>>  tmp;
line.push_back(tmp);  
//  压入一个数到某行
}

for   (  int   j  =   0  ;j  <  nSize;  ++  j) 
{
if  (i  ==  j) line.push_back(  1.0f  );
else   line.push_back(  0.0f  );
}


matrix.push_back(line);  
//  压入一行到矩阵
}

cout  
<<  endl;
work1(matrix);
work2(matrix);
makeunit(matrix);
cout 
<<  endl  <<   "  ########################  "   <<  endl
<<   "  求逆结果:  "   <<  endl;
outprint(matrix);
cout 
<<   "  ########################  "   <<  endl;

main();


return     0  ;    
}


有图有真相:

输入矩阵数据

计算步骤

计算结果

执行文件下载:http://www.cppblog.com/Files/billhsu/%E7%9F%A9%E9%98%B5%E6%B1%82%E9%80%86.rar

求解矩阵的逆的代码实现

求解矩阵的你主要应用的是高斯—若尔当方法,其运算步骤如下所示: 现在我们需要进行求解逆的矩阵是 {1237} \left\{ \begin{matrix} 1 & 3 \\ 2 ...
  • zp1996323
  • zp1996323
  • 2016年07月19日 15:09
  • 1315

C/C++语言实现矩阵求逆运算—高斯约化/消元法

在网站上搜索了一下,发现C语言代码可能是很原始的版本,编译的时候会报出诸多错误。 不过大致还是能看懂,就看你能不能转过弯来咯。 原文的代码是要存成矩阵形式,而实际代码写的着则是一维数组形式。 可...
  • luofl1992
  • luofl1992
  • 2012年07月27日 11:05
  • 7258

矩阵求逆计算的实现

学习计算机图形学,那么就应该了解计算机图形学的一些基础知识,比如说向量、矩阵、欧拉角以及四元数。其中矩阵尤其是4×4的矩阵在其中是比较重要的一部分了。因为它包含的信息多,一个4×4的矩阵可以表示平移(...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2014年03月06日 21:42
  • 2582

java n*n矩阵求值及求逆矩阵

java版的先写出来了,有的跟c语言相同的算法,然后看看能不能以后加个框做成程序: import java.math.*; import java.util.*; import java.text.*...
  • z8110
  • z8110
  • 2016年06月16日 14:20
  • 1797

VB.Net矩阵求逆

Function Rect_yu(A As Array, L As Integer, C As Array) As Single '矩阵求逆 Dim T0 As Single ...
  • u014581901
  • u014581901
  • 2016年03月04日 14:17
  • 987

c# 矩阵求逆(转载)

1.代码思路1)对矩阵进行合法性检查:矩阵必须为方阵2)计算矩阵行列式的值(Determinant函数)3)只有满秩矩阵才有逆矩阵,因此如果行列式的值为0(在代码中以绝对值小于1E-6做判断),则终止...
  • caimagic
  • caimagic
  • 2016年05月14日 18:35
  • 1720

矩阵求逆用C语言实现

矩阵求逆的C/C++源程序 刚做的作业: #include  #include  #include  #include  #define N 4 double A[N][N]={{1,3...
  • bigshady
  • bigshady
  • 2010年11月17日 19:44
  • 7752

c++求逆矩阵(初等变换法)

c++ 编写的逆矩阵求法的代码   #include #include using namespace std; static double a[50][50]; static do...
  • hehainan_86
  • hehainan_86
  • 2013年03月27日 10:33
  • 1487

c++实现任意矩阵求逆

  关于矩阵求逆记忆最深的就是在静宜大学参加程序比赛,这是遇见的第一个问题。刚才突然想到,于是又百度Google了一番,又有了下面这篇水文~  矩阵的求逆按矩阵类型分2种,一种是方阵,一种就是任意的矩...
  • stilling2006
  • stilling2006
  • 2010年05月01日 23:48
  • 14304

逆矩阵实现java代码

为了实现Hill密码,我们必须先实现如何求逆矩阵。A的逆矩阵公式为 A*/|A|,我们需要分别求出A*、|A|。 为了求出我们的伴随矩阵,我们要实现几个步骤的方法: 1、实现求出(h...
  • qiyu93422
  • qiyu93422
  • 2015年07月17日 01:56
  • 2888
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:矩阵求逆代码
举报原因:
原因补充:

(最多只允许输入30个字)