我无法理解以下所有代码。我认为我指出的代码的中间部分是执行乘法,但我不确定,有人可以向我解释代码的中间部分试图完成的内容吗?
我理解数组元素的输入和输出部分,但不了解实际的操作。
我理解这一点:
#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;
}
答案 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