Два цикла for, записанные как цикл while для присвоения значений симметричной матрице - PullRequest
0 голосов
/ 04 февраля 2012

Я знаю, что логика два входит в симметричную матрицу значений массива

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

Правильна ли логика, Как улучшить этот код?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Мне лично кажется, что цикл while выглядит менее чистым, чем вложенный цикл.Я думаю, что простое добавление дополнительного условия будет работать так:

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 голос
/ 05 февраля 2012

Сначала посмотрите на мой ответ о том, как представить симметричную матрицу с одномерным массивом здесь:

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) значений.

...