【问题标题】:Gaussian elimination from pseudocode伪代码的高斯消除
【发布时间】:2011-03-28 03:17:14
【问题描述】:

我尝试将高斯消除的伪代码 - 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

【问题讨论】:

  • 您需要向我们展示变量num、A等
  • 我假设您认为在 C 数组中的索引从 0 开始,而在“伪代码”中它们通常从 1 开始。所以 A 应该有一个虚拟的行和列。
  • 现在我处于同一阶段,在第三行中我得到零而不是 1...我已经纠正了它,所以我从 i=0 和 j=0 开始
  • 仍然没有解决方案 :-( 我已经多次检查该代码,但我仍然没有发现任何错误......

标签: c


【解决方案1】:

也许你忘了转换 tn C 这一行: “将第 i 行中的每个条目除以 A[i,j]” 类似的东西:

 for (k = j; k <= num+1; ++k) {
        A[i][k] /= A[i][j];
    }

【讨论】:

    【解决方案2】:

    看起来您正在将单元格 A[maxi][j]A[i][j] 交换,但算法要求将整行 maxi 与 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;
    }
    

    【讨论】:

    • 谢谢,看来你是对的。但是结果仍然没有变化,是否执行 last for 不好?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多