0

我想显示矩阵的次要。首先,我有一个 3 x 3 的矩阵。

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

正如评论中所说,循环遍历 3x3 矩阵只是为了将数字选择为 2x2 听起来有点过头了。

/** ?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

OR在应该使用逻辑的地方使用按位AND

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

现在,您只跳过 和 的交点处的bar元素kol。相反,您希望跳过整bar行和整kol列。

于 2012-12-17T10:01:32.083 回答
0

我认为这if (i!=bar | j!=kol){是一个问题。你应该使用 || (逻辑或)

于 2012-12-17T09:44:09.750 回答
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

首先,如果我们试图删除中间行和列,我认为您的预期结果是:

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 行和第 3 列,因此您将无法获得预期的结果。而且在你的代码中

如果 (i!=bar | j!=kol)

应该替换为

if (i!=bar && j!=kol) 因为您不需要“bar”行和“kol”列中的任何元素。

于 2012-12-17T10:19:18.667 回答