C代码行无所事事

时间:2017-04-15 17:45:47

标签: c

我目前在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按预期更改我的矩阵元素。

我真的不明白我程序的这种奇怪行为。我很高兴,有人可以帮助我。感谢。

1 个答案:

答案 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];