我试图将高斯消除的伪代码 - 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
答案 0 :(得分:1)
也许你忘记了转换这行: “将第i行中的每个条目除以A [i,j]” 类似的东西:
for (k = j; k <= num+1; ++k) {
A[i][k] /= A[i][j];
}
答案 1 :(得分:0)
看起来您正在使用A[maxi][j]
交换单元格A[i][j]
,但该算法要求使用i交换整行maxi:
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;
}