C++ 为什么这两个相似代码计算行列式的结果不同?
我在写一个计算行列式的函数。矩阵均为4x4二维阵列。我发现以下两段代码有不同的结果。并用MATLAB对结果进行了验证 我使用这样一个测试示例 02 01 3 3 2 1 32440 2 2 1 1 具有正确结果的代码:C++ 为什么这两个相似代码计算行列式的结果不同?,c++,C++,我在写一个计算行列式的函数。矩阵均为4x4二维阵列。我发现以下两段代码有不同的结果。并用MATLAB对结果进行了验证 我使用这样一个测试示例 02 01 3 3 2 1 32440 2 2 1 1 具有正确结果的代码: void determinant() { double result=1; int i; int j; int k; for(i=0;i<4;i++) {
void determinant()
{
double result=1;
int i;
int j;
int k;
for(i=0;i<4;i++)
{
for(j=i+1;j<4;j++)//swap the largest number to diagonal position
{
if(matrix[j][i]>matrix[i][i])
{
swap_row(i,j);
result=result*(-1);//once swap two rows, result will multiply by (-1)
}
}
for(j=i+1;j<4;j++)
{
double divident=matrix[j][i]/matrix[i][i];
for(k=0;k<4;k++)
{
matrix[j][k]=matrix[j][k]-matrix[i][k]*divident;//here is the different part
}
}
}
for(i=0;i<4;i++)
{
result=result*matrix[i][i];
}
cout<<"determinant="<<result<<endl;
}
错误的代码把矩阵变成了这个
3 3 2 1
02 01
040
01
至于函数swap\u row
,它的工作原理是这样的(我确信这里不存在问题):
void swap_元素(双重a、双重b)
{
双tmp;
tmp=a;
a=b;
b=tmp;
}
无效交换_行(整数i,整数j)
{
对于(column=0;columndisplay()
(该函数是类中的一个数字函数)逐步跟踪更改,但计算似乎没有错误,但顺序不同(正确的代码按行计算,错误的代码按数组中的单个元素计算)让我感到困惑的是,我没有改变关于循环的任何东西。所以这两个代码之间有什么区别? < P>我认为在你的代码的第二个变种中,你是在以很坏的方式重写东西。考虑循环超过代码> K<代码>,假设<代码> i=0 < /代码>并查看案例<代码> K=0 < /C> >:< /P>
matrix[j][0]=matrix[j][0]-matrix[0][0]*matrix[j][0]/matrix[0][0];
matrix[j][1]=matrix[j][1]-matrix[i][1]*matrix[j][0]/matrix[0][0];
这将重写条目<代码>矩阵[j](0)< /代码>现在考虑下一个相同循环的迭代,即<代码> k=1 < /C> >并且仍然<代码> i=0 < /代码>:
matrix[j][0]=matrix[j][0]-matrix[0][0]*matrix[j][0]/matrix[0][0];
matrix[j][1]=matrix[j][1]-matrix[i][1]*matrix[j][0]/matrix[0][0];
如您所见,这使用了您在上一次迭代中刚刚更新的元素
矩阵[j][0]
。因此您在此处使用了新值。在正确的代码版本中,您存储了矩阵[j][0]的值
开始循环之前,在整个循环中使用正确的、未更新的值。矩阵的类型是什么?@KamolHasan它是一个双矩阵[4][4]