4x4矩阵的行列式算法

时间:2014-11-10 14:57:06

标签: objective-c algorithm matrix determinants

我选择第一行并将每个元素乘以其辅助因子, 但在某些情况下,该方法返回nan。 例如,

1 0 0 1
0 2 0 0
0 0 3 0
0 0 0 4

在这种情况下,该方法返回nan

有谁知道我做错了什么?

getDet3返回3x3矩阵的行列式,并且工作正常。

-(double) getDet4:(double[4][4])mat {
    double det = 0;
    double small[3][3];

    int i, j, k;
    int i_ = 1, j_;

    for ( i=0; i<4; i++ ){

        if (mat[0][i] == 0) continue;

        // get the small matrix here
        for ( j=0; j<3; j++ ){
            j_ = 0;
            for ( k=0; k<3; k++ ){
                if ( i == j_ ) j_++;
                small[j][k] = mat[i_][j_];
                j_++;
            }
            i_++;
        }

        det += mat[0][i] * [self getDet3:small] * pow(-1, i+j);
    }

    return det;
}

2 个答案:

答案 0 :(得分:0)

就个人而言,我发现你的变量名称令人困惑。如果我理解您的想法,您希望i_的值j + 1j_k < i ? k : k + 1。恕我直言,如果将它们命名为j_p and k_`,或者甚至只使用等效表达式,就不那么容易混淆了。

无论如何,您不会在外部for循环内重新初始化i_。所以它实际上只是继续递增,导致数组边界之外的数组索引。

答案 1 :(得分:0)

嗯,你的代码中有一些错误。

1)i_ = 1的初始化应该在j循环之前完成,否则它将保留旧值。

2)pow(-1, i+j)的计算应仅取决于i,因为j每次在该表达式中具有相同的值(即3)。

因此,假设getDet3是正确的,i_超出界限就会引入错误。整体而言,代码应如下所示:

-(double) getDet4:(double[4][4])mat {
    double det = 0;
    double small[3][3];

    int i, j, k;
    int i_, j_;

    for ( i=0; i<4; i++ ){

        if (mat[0][i] == 0) continue;

        // get the small matrix here
        i_ = 1;
        for ( j=0; j<3; j++ ){
            j_ = 0;
            for ( k=0; k<3; k++ ){
                if ( i == j_ ) j_++;
                small[j][k] = mat[i_][j_];
                j_++;
            }
            i_++;
        }

        det += mat[0][i] * [self getDet3:small] * pow(-1, i);
    }

    return det;
}