0

行列式のマイナーを表示したい。まず、3x3の行列があります。

1 2 3

4 5 6

7 8 9

M11を表示したい(行1と列1を削除)ので、次のようになります

1 3

7 9

しかし、私のプログラムで私はこのようなものを手に入れました

1 2

4 0

これが私のコードです:

    public static double [][] Minor (double [][] M, int bar, int kol, int maxidx){
        double [][] minor = new double [2][2];
        int mini=0, minj=0;
        for (int i=0; i<2;i++){
            for (int j=0;j<2;j++){
                if (i!=bar | j!=kol){
                    minor[mini][minj]=M[i][j];
                    minj++;
                    if (minj==(maxidx-1)){
                        mini++;
                        minj=0;
                    }
                }
            }
        }
        return minor;
    }

マイナーを表示するために、私はこのコードを使用しました:

for (int i=0;i<2;i++){
    for (int j=0;j<2;j++){
        System.out.print(Minor(M,1,1,3)[i][j]+" ");
    }
        System.out.println();
}

私のコードの何が問題になっていますか?

4

5 に答える 5

0

OR論理を使用する必要がある場所でビット単位を使用していますAND

            if (i!=bar && j!=kol){
                       ^^

現在、barとの交点にある要素のみをスキップしていますkolbar代わりに、行全体kolと列全体をスキップする必要があります。

于 2012-12-17T10:01:32.083 に答える
0
 if (i!=bar | j!=kol)

これ| 論理演算子ではなくビット演算子ですが、論理全体が間違っています

これを行う

for (int i=0; i<=2;i++){
         if(i!=bar)
         {
            for (int j=0;j<=2;j++){
                if (j!=kol){
                    minor[mini][minj]=M[i][j];
                    minj++;
                    }
                }
            mini++;
         }
       }
 }
于 2012-12-17T09:46:27.850 に答える
0

if (i!=bar | j!=kol){これは問題だと思います。||を使用する必要があります (論理または)

于 2012-12-17T09:44:09.750 に答える
0

コメントで述べたように、2x2に数値を選択するためだけに、3x3マトリックスをループするのはやり過ぎに聞こえます。

/** ?skip : which is the first row/column we should keep (0/1)
 ** ?last : shall we skip the last item of the row/column.
 **/

public static double [][] MyMinor (double [][] M, int vskip, int vlast, int hskip, int hlast){
    double [][] minor = new double [2][2];
    int mini=0, minj=0;
    minor[0][0]=M[vskip][hskip];
    minor[0][1]=M[vskip][2-hlast];
    minor[1][0]=M[2-vlast][hskip];
    minor[1][1]=M[2-vlast][2-hlast];

    return minor;
}

// to remove any bar/kol combo:
MyMinor(input,bar==0?1:0,bar==2?1:0,kol==0?1:0,kol==2?1:0);
于 2012-12-17T10:09:57.190 に答える
0

まず、中央の行と列を削除しようとすると、期待される結果は次のようになると思います。

1 3

7 9

だから私はこれがあなたが探しているコードだと言うでしょう:

public static double [][] Minor (double [][] M, int bar, int kol, int maxidx){
    double [][] minor = new double [2][2];
    int mini=0, minj=0;
    for (int i=0; i<3;i++){
        for (int j=0;j<3;j++){
            if (i!=bar && j!=kol){
                minor[mini][minj]=M[i][j];
                minj++;
                if (minj==(maxidx-1)){
                    mini++;
                    minj=0;
                }
            }
        }
    }
    return minor;
}

問題はforループにありました:for(int i = 0; i <2; i ++)およびfor(int j = 0; j <2; j ++)。ご覧のとおり、Mの3行目と列に到達することはないため、期待した結果を得ることができません。そしてまたあなたのコードで

if(i!= bar | j!= kol)

に置き換える必要があります

if(i!= bar && j!= kol)'bar'行と'kol'列の両方の要素は必要ないため。

于 2012-12-17T10:19:18.667 に答える