java—如何找到特定行和列的辅因子?

jv4diomz  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(260)

好吧,我想找到特定行和列的辅因子
假设我有一个矩阵:

1  2  3
4  5  6
7  8  9

我想要这个职位的副手 0,0 结果是:

5  6
8  9

但是,我的代码总是生成一个 0 取决于我对值的处理
i , k n , m (注意下面的代码)
此代码生成以下矩阵:

5  0
8  9

顺便说一句,我从bluej得到了结果矩阵,我将在原始代码下面留下一个简单的打印矩阵代码中的所有元素,以防您不想使用debuger
代码如下:

public int[][] adjointMatrix(int matrixRow, int matrixColumn, int[][] matrix)
        throws ArrayIndexOutOfBoundsException {
    if (matrixColumn >= matrix.length || matrixRow >= matrix[0].length) {
        throw new ArrayIndexOutOfBoundsException();
    }
    int[][] Adjoint = new int[matrix.length - 1][matrix[0].length - 1];
    int m = 0;
    int n = 0;
    for (int i = 0; i < matrix.length; i++) {
        if (i == matrixRow) {
            continue;
        }
        for (int k = 0; k < matrix[i].length; k++) {
            if (k == matrixColumn) {
                continue;
            }
            Adjoint[m][n] = matrix[k][i];
            if (m < Adjoint.length - 1) {
                m++;
            }
        }
        if (n < Adjoint[0].length - 1) {
            n++;
        }
    }
    return Adjoint;
}
adjointMatrix(0, 0, new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});

打印整个矩阵:

// print it somewhere in a class
for (int i = 0; i < matrixname.length; i++) {
    for (int k = 0; k < matrixname[0].length; k++) {
        System.out.print(matrixname[i][k] + " ");
    }
    System.out.println();
}
eivgtgni

eivgtgni1#

你可以用 IntStream 迭代这个矩阵的索引, filter 输出指定的行和列并返回辅因子矩阵:

public static void main(String[] args) {
    int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}};

    int[] position = {0, 0};

    int[][] cofactor = cofactor(matrix, position);

    Arrays.stream(cofactor).map(Arrays::toString).forEach(System.out::println);
    // [5, 6]
    // [8, 9]
}
public static int[][] cofactor(int[][] matrix, int[] position) {
    return IntStream.range(0, matrix.length)
            .filter(i -> i != position[0])
            .mapToObj(i -> matrix[i])
            .map(row -> IntStream.range(0, row.length)
                    .filter(j -> j != position[1])
                    .map(j -> row[j])
                    .toArray())
            .toArray(int[][]::new);
}
jrcvhitl

jrcvhitl2#

应该是的 Adjoint[m][n] = matrix[i][k] 而不是 Adjoint[m][n] = matrix[k][i] . i 是行索引计数器 k 是列索引计数器。
此外,您还需要在以下情况下将行切换到下一行: n 位于相应行的末尾。那你就从 m 作为 m + 1 以及 n 作为 0 .
这是你的固定电话 adjointMatrix() 函数段:

public int[][] adjointMatrix(int matrixRow, int matrixColumn, int[][] matrix)  
    throws ArrayIndexOutOfBoundsException 
    {
        if (matrixColumn >= matrix.length || matrixRow >= matrix[0].length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        int[][] Adjoint = new int[matrix.length - 1][matrix[0].length - 1];
        int m = 0;
        int n = 0;
        for(int i = 0; i < matrix.length;i++) {
            if (i == matrixRow) {
                continue;
            }
            for(int k = 0; k < matrix[i].length;k++) {
                if(k == matrixColumn) {
                    continue;
                }
                Adjoint[m][n] = matrix[i][k];
                if (n == Adjoint[0].length - 1) {
                    m++;
                    n = 0;
                } else {
                    n++;
                }
            }
        }
        return Adjoint;
    }

但是,您可以用更简单的方法编写for循环部分,方法如下:

for(int i = 0; i < matrix.length;i++) {
        for (int j = 0; j < matrix[0].length; ++j) {
            if (i != matrixRow && j != matrixColumn) {
                Adjoint[m][n++] = matrix[i][j];
                if (n == Adjoint[m].length) {
                    n = 0;
                    ++m;
                }
            }
        }
    }

相关问题