2014-12-23 307 views
2

嗨,我使用此代碼高斯消除方法。當我使用這種算法的第二種形式時,我沒有得到正確的結果,但是在兩種情況下代碼都是相同的。所以 爲什麼這個工程:C - 二維數組

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]; 
     } 
    } 
} 
+1

在第二種情況下,首先發生乘法運算,然後結果分割。 –

+0

訂單優先權圖表:http://www.swansontec.com/sopc.html 從左至右依次爲:在您的情況下,乘法首先發生,然後是除法運算符。 –

回答

4

在第二個版本中,最內層循環修改的a[i+1][k]/a[k][k],因爲它的迭代值。

要回避這個問題,必須按照第一個版本中的表達方式將表達式分解出來。

想想減少梯隊形式和高斯消除如何工作。其中一個步驟是用對角線元素劃分整行,以便對角元素變成一個。如果在單獨潛入對角線元素之前不保存對角線元素的原始值,則會失去它的好處。

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描述瞭如何在表達有一堆的同類運營商的underparenthesized表達應該被加上括號。例如,加法從左到右是關聯的,所以a + b + c等於(a + b)+ c,而不是a +(b + c)。在普通算術中,這兩個表達式總是給出相同的結果;在計算機算術中,他們不一定。

+0

我寫了同樣的答案。你比我快。 –

+0

這是另一個區別,但仍然是'(a [k] [j] * a [i + 1] [k])/ a [k] [k];'不要使第二個代碼==第一個代碼 –

+1

哦我錯了!你是正確的,第二個代碼段將工作後的括號之後 –