我的for循环不起作用?

时间:2011-03-01 01:28:19

标签: c linear-algebra

我正在创建一个程序,通过遵循此算法使用Gauss-Jordan方法解决线性系统:

for each row ri of the matrix (i from 1 to n)
        replace ri with ri / rii
        for each row rk of the matrix (k!=i)
                replace rk with rk - rki * ri

显然我做得不对,因为只有行中的第一个元素被自己划分。我还是C的新手,所以任何帮助都会受到赞赏。谢谢!

for (k = 0; k < n; k++) {
    for (m = 0; m < n+1; m++) {
        if (matrix[k][m] < TOLERANCE) {
            printf("Error, pivot is 0\n");
            exit(0);
        }
        matrix[k][m] = matrix[k][m] / matrix[k][k];
    }

    for (l = 0; l != k; l++) {
        printMatrix(n, n+1, matrix);
        for (o = 0; o < n+1; o++) {
            matrix[l][o] = matrix[l][o] - matrix[l][k] * matrix[k][o];
        }
    }
}

还有其他输入吗?它仍然不太正确,我把我的头发拉出来lol

3 个答案:

答案 0 :(得分:3)

首先,内循环中的l != k是一个继续条件。换句话说,当l等于k时,该循环将退出

这不是原始代码中的工作方式。它继续使用l的所有其他值。

你可以改用这样的东西:

for(l = 0; l < n; l++) {
    if (l != k) {
        printMatrix(n, n+1, matrix);
        for (o = 0; o < n+1; o++) {
            matrix[l][o] = matrix[l][o] - matrix[l][k] * matrix[k][o];
        }
    }
}

而且,顺便说一下,你应该尝试摆脱一个字母的变量名,尤其是 l,这可能会在你第一次误以为它时咬你很厉害1: - )

答案 1 :(得分:3)

您将自己划分matrix[k][k](因此将其设置为1),然后将行的其余部分除以1.使用临时变量存储原始数据透视而不是使用matrix[k][k] < / p>

编辑虽然以上是代码中的错误,但正如其他人所指出的那样,这可能不会导致您遇到的问题,您还需要使用continue,而不是在l=k时终止循环。

答案 2 :(得分:1)

你应该替换

for(l = 0; l != k; l++){

for(l = 0; l < n; l++){
  if (l == k) continue;

第一个在l到达k后立即停止,因此只处理行0..k-1。第二个处理行0..n-1除了行k(适合您的伪代码“for each row rk of the matrix (k!=i)”)

此外:

for(m = 0; m < n+1; m++){

这意味着你有一个n行和n + 1列的矩阵,这是正确的吗?如果是这样的话,其他一切看起来都很好。