C - 二维数组

时间:2014-12-23 14:52:44

标签: c arrays

您好我使用此代码进行高斯消除方法。当我使用这种算法的第二种形式时,我得不到正确的结果,但在这两种情况下代码是相同的。所以 为什么会这样:

for(k = 0 ; k < (n-1) ; k++) {

    for(i = k ; i < (n-1) ; i++) {

       temp = a[i+1][k]/a[k][k];  //Why?

       for(j = k ; j < n ; j++) {
            a[i+1][j] -=  a[k][j] * temp;
       }
   }
}

这并不起作用:

for(k = 0 ; k < (n-1) ; k++) {

    for(i = k ; i < (n-1) ; i++) {

       for(j = k ; j < n ; j++) {

            a[i+1][j] -=  a[k][j] * a[i+1][k]/a[k][k];
       }
   }
}

2 个答案:

答案 0 :(得分:4)

在第二个版本中,最里面的循环会修改a[i+1][k]/a[k][k]的值,因为它正在迭代。

要回避这一点,你必须在第一个版本中完成你的表达。

考虑减少的梯形形式以及高斯消除的工作原理。其中一个步骤是将整行划分为对角元素,以使对角元素变为一。如果您在对角元素自身潜水之前没有保存原始值,那么它将永远丢失。

答案 1 :(得分:3)

*\具有相同的优先权。在这种情况下,运算符的关联性 * 很重要。因此在第二种情况下

 a[i+1][j] -=  a[k][j] * a[i+1][k]/a[k][k];  

将被视为

 a[i+1][j] -=  (a[k][j] * a[i+1][k])/a[k][k];   

因为当运算符具有相同的优先级时,就会发生从左到右的关联。

括号a[i+1][k]/a[k][k],第二个代码段将起作用

a[i+1][j] -=  a[k][j] * (a[i+1][k]/a[k][k]); 

* Associativity rules描述当表达式具有一堆相同类型的运算符时,如何将表示不足的表达式括起来。例如,加法从左到右是关联的,因此a + b + c等价于(a + b)+ c,而不是+(b + c)。在普通算术中,这两个表达式总是给出相同的结果;在计算机算术中,它们不一定。