Гауссово исключение из псевдокода - PullRequest
1 голос
/ 27 марта 2011

Я попытался преобразовать псевдокод исключения Гаусса - http://en.wikipedia.org/wiki/Gaussian_elimination#Pseudocode в фактическую реализацию на C. Я сделал это, я не получаю ошибок, но я получаю тот же вывод, что и ввод. Кто-нибудь знает, где можно ошибиться? В качестве импульса у меня есть матрица 3x4 A, где num обозначает количество строк (в данном случае 3), а num + 1 обозначает количество столбцов.

void GE(){
    int i=1;
    int j=1;
    int k,u;

    while(i<=num && j<=num+1){
      int maxi=i;
      for(k=i+1;k<num;k++){
        if(abs(A[k][j])>abs(A[maxi][j])){
            maxi=k;
        }
      }
      if(A[maxi][j]!=0){
        float p;
        p=A[maxi][j];
        A[maxi][j]=A[i][j];
        A[i][j]=p;
        for(u=i+1;u<num;u++){
            A[u][j]=A[u][j]-A[i][j]*A[u][j];
        }
      }//endif
      j++;
      i++;

    }//endwhile

редактирование:

FILE *inputMatrix=fopen("file.in","r");
 fscanf(inputMatrix,"%d",&num);
 for(i=0;i<num;++i){
    for(j=0;j<num+1;++j){
        fscanf(inputMatrix,"%f",&A[i][j]);
    }
 }
 fclose(inputMatrix);

file.in:

3
2 1 -1 8
-3 -1 2 -11
-2 1 2 -3

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Возможно, вы забыли преобразовать эту строку в C: «разделить каждую запись в строке i на A [i, j]» Что-то вроде:

 for (k = j; k <= num+1; ++k) {
        A[i][k] /= A[i][j];
    }
0 голосов
/ 27 марта 2011

Похоже, вы меняете ячейку A[maxi][j] на A[i][j], но алгоритм требует поменять макси всей строки на i:

swap rows i and maxi, but do not change the value of i
Now A[i,j] will contain the old value of A[maxi,j].

Так что вам понадобится дополнительный цикл forиз [0, num + 1), который делает этот обмен:

int x
for(x = 0; x < num+1; x++) {
    p=A[maxi][x];
    A[maxi][x]=A[i][x];
    A[i][x]=p;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...