0

最初の行を選択し、各要素に余因子を掛けますが、場合によってはメソッドが を返しnanます。例えば、

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

この場合、メソッドは を返しますnan

誰かが私が間違ったことを知っていますか?

getDet33x3 行列の行列式を返し、正常に動作します。

-(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 + 1ありj_k < i ? k : k + 1. j_p and私見、それらにk_`という名前を付けたり、同等の式を使用したりすることで、混乱が少なくなるでしょう。

i_いずれにせよ、外側の for ループ内で再初期化することはありません。したがって、実際にはインクリメントし続け、配列の範囲外の配列インデックスになります。

于 2014-11-10T15:22:44.087 に答える