矩阵操作代码执行未知操作

时间:2016-05-25 00:25:49

标签: matrix matrix-multiplication

我无法理解以下所有代码。我认为我指出的代码的中间部分是执行乘法,但我不确定,有人可以向我解释代码的中间部分试图完成的内容吗?

我理解数组元素的输入和输出部分,但不了解实际的操作。

我理解这一点:

 #include "stdafx.h"
    #include<iostream>
    using namespace std;
    int main()
    {
       int i,j,k,n;
       float a[100][200],t;
       cout<<"Enter order of matrix-";
       cin>>n;
       cout<<"Enter elements of matrix"<<endl;
       for(i=0;i<n;i++)
          for(j=0;j<n;j++)
             cin>>a[i][j];

但以下几行令人困惑:

      for(i=0;i<n;i++)
       {
          for(j=n;j<2*n;j++)
          {
              if(i==j-n)
                 a[i][j]=1;
             else
                 a[i][j]=0;
           }
       }
       for(i=0;i<n;i++)
       {
          t=a[i][i];
          for(j=i;j<2*n;j++)
              a[i][j]=a[i][j]/t;
          for(j=0;j<n;j++)
          {
             if(i!=j)
             {
                t=a[j][i];
                for(k=0;k<2*n;k++)
                    a[j][k]=a[j][k]-t*a[i][k];
              }
          }
       }

同样,以下几行是可以理解的:

cout<<"\n\nInverse matrix\n\n";
       for(i=0;i<n;i++)
       {
          for(j=n;j<2*n;j++)
             cout<<"\t"<<a[i][j];
          cout<<"\n";
        }
    return 0;
    }

1 个答案:

答案 0 :(得分:0)

您的代码正在尝试反转矩阵。这是代码正在做的事情。

假设你有一个nxn矩阵A,我们可以创建一个新的nx2n矩阵

  

B = AI

其中我是一个nxn单位矩阵。 B的创建是这些线路试图做的:

for(i=0;i<n;i++)
       {
          for(j=n;j<2*n;j++) // makes sure you are only accessing columns in the right hand part of the matrix
          {
              if(i==j-n)
                 a[i][j]=1;
             else
                 a[i][j]=0;
           }
       }

然后在这个2n宽矩阵上执行一系列行操作以获得左侧的单位矩阵,从而产生第三个矩阵

  

C = ID

其中我再次是nxn单位矩阵。 C到行操作的创建就是代码的这一部分试图做的事情:(虽然我不会说正在使用的算法的正确性,因为我已经做了一段时间,而且我通常只使用SVD算法进行反转)

for(i=0;i<n;i++) //transform B matrix into C matrix
       {
          t=a[i][i];
          for(j=i;j<2*n;j++)
              a[i][j]=a[i][j]/t;
          for(j=0;j<n;j++)
          {
             if(i!=j)
             {
                t=a[j][i];
                for(k=0;k<2*n;k++)
                    a[j][k]=a[j][k]-t*a[i][k];
              }
          }
       }

现在,当您成功完成行操作并在C矩阵的左侧获得单位矩阵时,结果是构成C矩阵右侧的nxn D矩阵是A的倒数我们有

  

AD = I

这就是为什么最后一段代码只能抓住我称之为C矩阵的右侧。

这就是您的代码尝试做的事情。如果你想更多地了解它背后的理论,我会看一下“C中的数字食谱”一书。这是此类事物的黄金标准,可在线免费获取。 http://www.nrbook.com/a/bookcpdf.html