【问题标题】:Matrix manipulation code performing unknown operations执行未知操作的矩阵操作代码
【发布时间】:2016-05-25 00:25:49
【问题描述】:

我无法理解以下所有代码。我认为我指出的代码的中间部分正在执行乘法,但我不确定,有人可以向我解释一下代码的中间部分要完成什么吗?

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

我明白这一点:

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

【问题讨论】:

    标签: matrix matrix-multiplication


    【解决方案1】:

    您的代码正在尝试反转矩阵。下面是代码的作用。

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

    B = 人工智能

    其中 I 是一个 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

    其中 I 再次是 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 = 我

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

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

    【讨论】:

    • 有更简单的方法吗?
    • 一般来说不是。如果您的矩阵是 2x2,您可以使用一种叫做 cramer 规则的东西,但一般来说,您会被这个或“奇异值分解”所困扰,以获得一个更复杂的伪逆。数字食谱书具有 SVD,因此您可以根据需要比较复杂性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多