5.17MY逆矩阵代码出世了!!

       前面在求三角形的外心的时候寸步难行,不知道如何下手,有没找到已封装的函数,自能自己推了。头疼啊!!

后面经过换算,发现此问题的关键之处就在于求矩阵的逆,于是就有了下面的东西。因为我是用于求外心,所以针对的是2阶矩阵,如果是针对高阶的,请自己对代码进行稍加修改即可,思路都一样。

      谢谢大家的分享!!(不知道什么原因图片没有显示出来,下面留言有图片!)

 代码如下:

#include <iostream>
#include <iomanip.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//#include <cmath>
//using namespace std;

 

void main()
{


 int m_size=2;   //定义矩阵维数

 double A[2][2]={2,5,4,0};      //定义初始矩阵
 //int m_size=sizeof(A);   //定义矩阵维数
 double inA[2][2]={0};   //定义逆矩阵
 double InitMatrix[2][2*2]={0};    //定义增广矩阵


 for(int i=0;i<=m_size-1;i++)      //赋值给增广矩阵
 {
  
  for(int j=0;j<=m_size*2-1;j++)
  {
   if (j<=m_size-1)
   {
    InitMatrix[i][j]=A[i][j];
   }
   else if (j==m_size+i)
    InitMatrix[i][j]=1;
   else
                InitMatrix[i][j]=0;
  }    
 }

 


 cout<<"原矩阵如下:"<<endl; 

//输出矩阵
 for(int ii=0;ii<=m_size-1;ii++)      //赋值给增广矩阵
 {
  cout<<setiosflags(ios::right)<<endl;    //输出格式设定
  for(int jj=0;jj<=m_size-1;jj++)
  {
   cout<<setw(12)<<InitMatrix[ii][jj];
   
  }    
 }
    cout<<endl; 


  

//用初等变换求逆(A E)->(E inA)

//从第i行选取主元; 
 for(int iline=0;iline<=m_size-1;iline++)   
 {  
  int maxLine=iline;  
  double maxMember=InitMatrix[iline][iline]; 

  for(int line=iline;line<=m_size-1;line++)
  { 
   if(fabs(InitMatrix[line][iline])>fabs(maxMember))
   {
    maxLine=line;
    maxMember=InitMatrix[line][iline];
   }
  }
  
  
  if(maxMember==0)
  {
   cout<<"error 该矩阵不可逆!....\n";
   exit(-1);
  }


  for(int row=0;row<=2*m_size-1;row++)     //将绝对值最大的列元素换到相应对角位置
   //swap(InitMatrix[maxLine][row],InitMatrix[iline][row]);
       
   {
    double swaptemp=InitMatrix[maxLine][row];  
    InitMatrix[maxLine][row]=InitMatrix[iline][row];       
    InitMatrix[iline][row]=swaptemp;
   }


  double max_linetemp=InitMatrix[iline][iline];
  for(int x=0;x<=2*m_size-1;x++)    
   InitMatrix[iline][x]=InitMatrix[iline][x]/max_linetemp;    //将对角线的元素化1  
  

  for(int kk=iline+1;kk<=m_size-1;kk++)
  {

   double temptemp=InitMatrix[kk][iline];
   for(int k=iline;k<=2*m_size-1;k++)      //其他列元素化为0
   {
  
    InitMatrix[kk][k]=InitMatrix[kk][k]-InitMatrix[iline][k]*temptemp;    
  
   }     

  } 

 
 }
 

////////////////////////////////从m_size-1列往回,把非对角元素化为0


 for (int ri=m_size-1;ri>=1;--ri)
 {
  for (int rj=0;rj<=ri-1;++rj)    //循环从0行到ri-1行
  {
   double rtemp=InitMatrix[rj][ri];
   for (int rx=ri;rx<=2*m_size-1;++rx)
   {

    InitMatrix[rj][rx]=InitMatrix[rj][rx]-InitMatrix[ri][rx]*rtemp;
   }
  }
 }

//
 cout<<"逆矩阵如下:"<<endl; 
 
 for(int iiiii=0;iiiii<=m_size-1;iiiii++)     
 {
  cout<<setiosflags(ios::right)<<endl; 
  for(int jjjjj=m_size;jjjjj<=m_size*2-1;jjjjj++)
  {
   cout<<setw(12)<<InitMatrix[iiiii][jjjjj];
   
  } 
  
 }
    cout<<endl; 

 

}

 

 

 

 

 

 

 

 

 

 

posted on 2012-05-17 12:08  stream2011  阅读(334)  评论(1)    收藏  举报