0

論理 2 が配列の値を対称行列に入れることを知っています

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

ロジックは正しいですか、このコードを改善するにはどうすればよいですか?

4

2 に答える 2

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 ループを通過するサイクルがいくつか発生しますが、それが懸念される場合は簡単に改善できるはずです。

于 2012-02-04T19:36:22.597 に答える
1

最初に、ここで 1D 配列を使用して対称行列を表す方法に関する私の回答を見てください。

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)入力する必要があるのは値だけです。

于 2012-02-04T20:09:05.290 に答える