我目前在C代码中遇到了一些奇怪的行为。我想使用高斯消除和一个用作结构的矩阵
typedef struct {
int nrows;
int ncols;
double **row;
} Matrix;
我遇到的唯一问题是使用此代码行来解决高斯消除步骤:
A->row[zeile][0] = A->row[zeile][0] - (A->row[zeile][0] / A->row[0][0]) * A->row[0][0];
A->row[zeile][1] = A->row[zeile][1] - (A->row[zeile][0] / A->row[0][0]) * A->row[0][1];
A->row[zeile][2] = A->row[zeile][2] - (A->row[zeile][0] / A->row[0][0]) * A->row[0][2];
它没有使用for循环,因此我将算法的第1步写为单个命令。当运行上面的代码时,只有我的代码的第一行改变了我的矩阵的元素。第2行和第3行不会更改任何值。 当注释第1行并再次运行我的程序时,步骤2和步骤3按预期更改我的矩阵元素。
我真的不明白我程序的这种奇怪行为。我很高兴,有人可以帮助我。感谢。
答案 0 :(得分:1)
Gaussian elimination需要根据原始设置值进行更新。
A->row[zeile][0] = A->row[zeile][0] - (A->row[zeile][0] / A->row[0][0]) * A->row[0][0];
// not original values
// v v v
A->row[zeile][1] = A->row[zeile][1] - (A->row[zeile][0] / A->row[0][0]) * A->row[0][1];
相反,某事就像
一样// Save some of the original values
double A_0_0 = A->row[0][0];
double A_0[3] = { A->row[0][0], A->row[0][1], A->row[0][2] };
for (zeile = 0; zeile < 3; zeile++)
double A_zeile_0 = A->row[zeile][0];
for (c = 0; c < C; c++)
A->row[zeile][c] -= (A_zeile_0 / A_0_0) * A_0[c];