0

我选择第一行并将每个元素乘以其辅因子,但在某些情况下,该方法返回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;
}
4

2 回答 2

1

好吧,您的代码中有一些错误。

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;
}
于 2014-11-10T15:24:40.880 回答
0

就个人而言,我发现您的变量名称令人困惑。如果我正确理解您的想法,您希望i_拥有价值j + 1j_成为k < i ? k : k + 1. 恕我直言,将它们命名为j_p andk_` 甚至只使用等效的表达式就不会那么混乱了。

无论如何,您都不会i_在外部 for 循环内重新初始化。所以它实际上只是不断增加,导致数组索引超出数组边界。

于 2014-11-10T15:22:44.087 回答