我在理解以下所有代码时遇到了问题。我想我指出的代码的中间部分是在执行乘法,但我不确定,有人能给我解释一下代码的中间部分试图实现什么吗?
我理解数组元素的输入和输出部分,但不了解实际的操作。
我明白这点:
#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;
}
发布于 2016-05-25 01:29:41
您的代码正在尝试对矩阵求逆。下面是代码正在做的事情。
假设您有一个n×n矩阵A,我们可以创建一个新的nx2n矩阵
B= AI
其中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 =i
这就是为什么最后一段代码只抓住了我所说的C矩阵的右边。
这就是您的代码要做的事情。如果你想了解更多关于它背后的理论,我可以看看“C中的数值食谱”这本书。这是这类事情的黄金标准,并且可以在网上免费获得。http://www.nrbook.com/a/bookcpdf.html
https://stackoverflow.com/questions/37425983
复制相似问题