2011-03-01 124 views
2

我創建按照這個算法解決了使用高斯 - 喬丹法線性系統的程序:我的for循環不起作用?

for each row ri of the matrix (i from 1 to n) 
     replace ri with ri/rii 
     for each row rk of the matrix (k!=i) 
       replace rk with rk - rki * ri 

顯然,我不這樣做是正確的,因爲只有該行的第一個元素被除以本身。我還是C新手,所以任何幫助,將不勝感激。謝謝!

for (k = 0; k < n; k++) { 
    for (m = 0; m < n+1; m++) { 
     if (matrix[k][m] < TOLERANCE) { 
      printf("Error, pivot is 0\n"); 
      exit(0); 
     } 
     matrix[k][m] = matrix[k][m]/matrix[k][k]; 
    } 

    for (l = 0; l != k; l++) { 
     printMatrix(n, n+1, matrix); 
     for (o = 0; o < n+1; o++) { 
      matrix[l][o] = matrix[l][o] - matrix[l][k] * matrix[k][o]; 
     } 
    } 
} 

還有其他的意見嗎?它仍然是不完全正確,我拉我的頭髮笑

+0

什麼是'n'和'm'?只是變量被傳遞給函數? – 2011-03-01 01:29:52

+0

n是系統中的行數。米是一個計數器。它應該是一個增廣矩陣,所以也有n + 1列。 – Manske 2011-03-01 01:31:35

回答

1

此時應更換

for(l = 0; l != k; l++){ 

for(l = 0; l < n; l++){ 
    if (l == k) continue; 

第一個爲l達到k就停止,所以只流程行0..k-1。第二個處理行0..n-1除了k行(其適合於你的僞「for each row rk of the matrix (k!=i)」)

另外:

for(m = 0; m < n+1; m++){ 

這意味着你必須有n行的矩陣和n + 1列,這是正確的?如果是這樣,就我所能說的,其他一切看起來都很好。

+0

是的,n行和n + 1列 – Manske 2011-03-01 01:34:52

3

首先,內循環中的l != k是繼續條件。換句話說,當l等於k時,該循環將退出

這不是它在原始代碼中的工作原理。它繼續爲l的所有其他值。

您可以使用這樣的事情,而不是:

for(l = 0; l < n; l++) { 
    if (l != k) { 
     printMatrix(n, n+1, matrix); 
     for (o = 0; o < n+1; o++) { 
      matrix[l][o] = matrix[l][o] - matrix[l][k] * matrix[k][o]; 
     } 
    } 
} 

而且,順便說一句,你應該嘗試從一個字母的變量名,離開尤其l,它可以咬你挺厲害你第一次誤將它作爲1 :-)

3

你將自己劃分matrix[k][k](因此將它設置爲1),然後將行的其餘部分除以1.使用一個臨時變量來存儲原來的主鍵使用matrix[k][k]

編輯:雖然上面的代碼中的錯誤,這可能不會引起你正在經歷什麼,正如其他人所指出的,你還需要使用continue,而不是終止循環的時候l=k

+1

+1 ...良好的捕獲。 – 2011-03-01 03:02:01