【问题标题】:Transposing matrices in JavaJava中的转置矩阵
【发布时间】:2020-10-17 19:58:59
【问题描述】:

我想我在这里遗漏了一些关于 Java 的基本知识,我不确定为什么下面的代码不起作用,我的步骤:

  1. 输入是一个 2x2 矩阵,
  2. 复制原始矩阵,
  3. 遍历行然后列,
  4. 将原始矩阵的列值分配给转置矩阵的行。
static void transpose(int[][] matrix) {
    int[][] temp = matrix.clone();
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            matrix[i][j] = temp[j][i];
        }
    }
}

【问题讨论】:

  • 请提供输入输出示例。行为以何种方式偏离预期行为?
  • 您需要使用数组维度作为 for 循环的限制。您的矩阵值可能是 2x5

标签: java arrays matrix transpose


【解决方案1】:

问题在于使用函数clone(),因为这将创建一个仅共享行数组的新矩阵。

使用相同的代码样式,可以:

int[][] temp = new int[2][2];
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
        temp[i][j] = matrix[j][i];
    }
}

请注意,由于 temp 是一个空矩阵,因此比较将是 temp = matrix

所以这适用于简单的 2x2 矩阵,但如果您需要其他维度,而不是

int[][] temp = new int[2][2];

使用

int[][] temp = new int[matrix[0].length][matrix.length];

顺便说一句,更新矩阵的参考内存不是一个好习惯。我认为你的方法应该返回temp 矩阵。

整个更新,更好的方法可能是这个。几乎和你一样,但它可以接受不同的长度。

public static int[][] transpose(int [][] matrix){
    int[][] temp = new int[matrix[0].length][matrix.length];
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[i].length; j++) {
            temp[j][i] = matrix[i][j];
        }
    }
    return temp;
}

【讨论】:

    【解决方案2】:

    你可以用IntStream代替for循环

    public static void main(String[] args) {
        int[][] m1 = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}};
    
        int[][] m2 = transpose(m1);
    
        Arrays.stream(m2).map(Arrays::toString).forEach(System.out::println);
        // [1, 4, 7]
        // [2, 5, 8]
        // [3, 6, 9]
    }
    
    static int[][] transpose(int[][] matrix) {
        return IntStream.range(0, matrix.length).mapToObj(i ->
                IntStream.range(0, matrix[i].length).map(j ->
                        matrix[j][i]).toArray())
                .toArray(int[][]::new);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2013-03-05
      • 1970-01-01
      • 2012-05-08
      • 2010-11-13
      • 2011-06-23
      相关资源
      最近更新 更多