首页 > 解决方案 > 矩阵的逆

问题描述

直到现在,我开发了一个可以打印用户输入的矩阵的代码。

并尝试在数学上计算倒数,但我无法收到正确的结果。它通过函数获取行列式,然后逐步获取与旧矩阵相反的新矩阵的每个新元素

我试着简单地做到这一点这是我的代码我想要一个更好的算法来完成这个任务

      #include <iostream>
     #include <stdlib.h>

       using namespace std;

     float Det (int  arr [3][3] )
      {

int res = arr[0][0]*(arr[1][1]*arr[2][2]-arr[2][1]*arr[1][2])-arr[0][1]*(arr[1][0]*arr[2][2]-arr[1][2]*arr[2][0])+arr[0][2]*(arr[1][0]*arr[2][1]-arr[1][1]*arr[2][0]);

return res ;

    }

  int main()
  {
int arr [3][3] ={{0,0,0},{0,0,0},{0,0,0}};
float inv [3][3]={{0,0,0},{0,0,0},{0,0,0}};
for(unsigned i = 0 ; i<3 ;i++)
{
    for(unsigned j= 0 ;j<3 ;j++)
    {
        cout << "Enter The Value Of The Element < " <<i+1<<" , "<<j+1<<" > :" ;
        cin >> arr [i][j] ;
    }
}
system("cls") ;
float det = Det(arr) ;

for(int i = 0 ; i < 3 ;i++)
{
    for(unsigned j = 0 ; j< 3 ; j++)
    {
        unsigned m [2]={i+1,i+2} ;
        unsigned n [2]={j+1,j+2} ;
        for(unsigned k = 0 ; k< 2 ;k++)
        {
            if(m[k]>2)
            {
                m[k]=0;
                swap(m[0],m[1]);

            }
            if(n[k]>2)
            {
                n[k]=0;
                swap(n[0],n[1]) ;

            }

        }
        inv [i][j] = arr[m[0]][n[0]]*arr[m[1]][n[1]]-arr[m[0]][n[1]]*arr[m[1]][n[0]] ;
        if((i+j)%2!=0)
        {
            inv [i] [j] = -inv[i][j] ;
        }
        inv [i] [j] = (1/det) * inv[i] [j];
    }
}
swap(inv[0][1],inv[1][0]);
swap(inv[2][1],inv[1][2]);
swap(inv[0][2],inv[2][0]);


cout << " Your Matrix is "<<endl ;
for(unsigned i = 0 ; i<3 ;i++)
{
    cout<< "     " ;
    for(unsigned j= 0 ;j<3 ;j++)
    {

        cout<< arr [i][j]<< "  " ;
    }
    cout <<endl<<endl ;
}


cout<< "DET =  "<<det <<endl ;


cout << " Your Inverse is "<<endl ;
for(unsigned i = 0 ; i<3 ;i++)
{
    cout<< "     " ;
    for(unsigned j= 0 ;j<3 ;j++)
    {

        cout<< inv [i][j]<< "  " ;
    }
    cout <<endl<<endl ;
}
  }

标签: c++arrays

解决方案


@MahmoudMohammad。把你的代码想象成一首诗。出于可读性原因,它需要清晰,缩进良好,并带有注释。正如@Peter 上面提到的,您使用其他有效的方法而不是普通的高斯消除技术,因为随着矩阵的大小变大,这在计算上可能非常昂贵。但是,您可以通过阅读thisthis来改进您的代码。有关其他方法的更多信息,另参阅


推荐阅读