使用Java函数转置double[][]矩阵?

11

有没有一个函数可以在Java中转置具有以下形式的矩阵:

double[][]
我有一个像这样的函数:

public static double[][] transposeMatrix(double [][] m){
    for (int i = 0; i < m.length; i++) {
        for (int j = i+1; j < m[0].length; j++) {
            double temp = m[i][j];
            m[i][j] = m[j][i];
            m[j][i] = temp;
        }
    }

    return m;
}
但它在某处有错误。

7
尝试一下再问。 - Sachin
for (int j = i+1; ... => for (int j = 0; ...) - 同时您不需要返回m,调用者已经有对它的引用。 - assylias
@Pshemo 这个好像关闭得有点快啊... - assylias
@assylias 是的,在 OP 发布尝试之前,它已经被关闭了。在那之后,我投票重新开放它。 - Pshemo
@gurehbgui 你想做什么?如果你想改变“方阵”中元素的位置,那么你的代码是正确的。如果你想将非方阵矩阵(比如{{1,2,3},{4,5,6}})转置为{{1,4},{2,5},{3,6}},你需要创建并返回新的数组,因为你不能添加/删除已经存在的数组行。 - Pshemo
请参考我使用Apache库的解决方案。 - Wen-Bin Luo
7个回答

29
    public static double[][] transposeMatrix(double [][] m){
        double[][] temp = new double[m[0].length][m.length];
        for (int i = 0; i < m.length; i++)
            for (int j = 0; j < m[0].length; j++)
                temp[j][i] = m[i][j];
        return temp;
    }

4
你不应该检查 m[0] 是否会导致 IndexOutOfBoundsException 异常吗? - khatchad
这段代码非常完美,只要你不把行和列搞混就行。[m [0] .length] 表示新创建矩阵的行大小,而[m.length]则表示其列大小。因此,转置矩阵是按与直觉相反的方式创建的。首先它获取“旧”列的大小,然后是“旧”行的大小:double[][ ] temp = new double[columnSize][rowSize]; - JacobTheKnitter

4
如果您想使用外部库,Apache Commons Math提供了转置矩阵的实用程序。请参考它的官方网站
首先,您需要创建一个双重数组double[][] arr,就像您已经完成的那样。然后,可以通过以下方式实现转置的2d矩阵。
MatrixUtils.createRealMatrix(arr).transpose().getData()

2

自Java 8开始,您可以这样做:

public static double[][] transposeMatrix(final double[][] matrix) {

    return IntStream.range(0, matrix[0].length)
        .mapToObj(i -> Stream.of(matrix).mapToDouble(row -> row[i]).toArray())
        .toArray(double[][]::new);
}

1

Java类,用于转置矩阵:

import java.util.Scanner;

public class Transpose {

    /**
     * @param args
     */

    static int col;
    static int row;
    static int[][] trans_arr = new int[col][row];

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        col = m;
        int n = sc.nextInt();
        row = n;

        int[][] arr = new int[row][col];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                arr[i][j] = sc.nextInt();
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
        int[][] trans_arr = new int[col][row];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                trans_arr[j][i] = arr[i][j];
            }
        }
        for (int i = 0; i < col; i++) {
            for (int j = 0; j < row; j++) {
                System.out.print(trans_arr[i][j] + " ");

            }
            System.out.println();
        }

    }

}

1
这里有一段代码可以“原地”(不使用另一个数据结构保存输出)转置一个二维矩阵,并因此更加内存高效:
以下算法同样适用于int、char或string数据类型。
  public static double[][] transposeDoubleMatrix(double[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                double tmp = matrix[j][i];
                matrix[j][i] = matrix[i][j];
                matrix[i][j] = tmp;
            }
        }
        return matrix;
    }

1
这是一个方法。
public static double[][] transpose(double arr[][]){
    int m = arr.length;
    int n = arr[0].length;
    double ret[][] = new double[n][m];

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ret[j][i] = arr[i][j];
        }
    }

    return ret;
}

-1

这里有一个小改变!

for (int j = i; j < m[0].length; j++)

1
嗨,我看到您是该网站的新贡献者,能否请您解释一下,以便不只是一行代码。谢谢! - kuskmen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接