2012-02-04 16 views
0

我知道邏輯兩個循環進入一個對稱矩陣陣列的值兩個書面作爲分配價值while循環對稱矩陣

int k=0; 
for (int i = 0; i < size; i++){ 
    for (int j = 0; j <= i; j++){     
      Q[i, j] = Q[j, i]= arr[k++]; 
    } 
} 

但如何做到這一點,如果我只能用一個while循環?

我在做這樣的事情:

int i=0; 
int j=0; 
while (reader.Read()) 
{ 
    Q[i, j] = Q[j, i]=reader.GetDouble(1); 
    if (j < i){ 
     j++; 
    }else{ 
     j = 0; 
     i++; 
    } 
} 

是邏輯正確,如何改善這種代碼?

+1

*不*使用兩個嵌套for循環的原因是什麼?第一種方法看起來更可讀。 – 2012-02-04 19:35:28

+0

我正在讀取SQL查詢的結果,而我只對查詢結果之一的結果感興趣,並且這個結果我想把它們放在一個對稱矩陣Q [i,j] = Q [我,我]'但不知道如何 – cMinor 2012-02-04 19:37:16

回答

3

我個人認爲while循環看起來比嵌套的for循環乾淨。我認爲只是增加這樣一個額外的條件將工作:

int k=0; 
for (int i = 0; i < size; i++){ 
    for (int j = 0; j <= i && reader.Read(); j++){     
      Q[i, j] = Q[j, i]= reader.GetDouble(1); 
    } 
} 

如果讀者返回false之前,你的矩陣是滿它會花一些週期通過i循環下去,但它應該是簡單的提高,如果這關心。

+1

確實。引用Brian Kernighan的話說:「每個人都知道,調試比編寫程序要困難一倍。所以,如果你寫的時候你的聰明才智,你將如何進行調試?「 – 2012-02-04 19:37:39

1

首先看一下我的答案上如何與一維數組在這裏代表一個對稱矩陣:

https://stackoverflow.com/a/9040526/380384

所以,你可以分配值這樣

int k = 0; 
while (reader.Read()) 
{ 
    A[k++] = reader.GetDouble(1); 
} 
int size = (int)(Math.Sqrt(2*k+0.25)-0.5); 

因爲只有size*(size+1)值需要輸入。