Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这两个相似代码计算行列式的结果不同?_C++ - Fatal编程技术网

C++ 为什么这两个相似代码计算行列式的结果不同?

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++) {

我在写一个计算行列式的函数。矩阵均为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++)
        {
            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]