9

次の形式のJavaでMatrixを転置できる関数を誰かが持っていますか?

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;
}

しかし、どこか間違っています。

4

7 に答える 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;
    }
于 2013-03-19T10:46:19.227 に答える
4

外部ライブラリを使用する場合は、ApacheCommonsMathが行列を転置するユーティリティを提供します。公式サイトを参照してください。

double[][] arrまず、すでに行ったように、double配列を作成する必要があります。次に、転置された2D行列は次のように実現できます。

MatrixUtils.createRealMatrix(arr).transpose().getData()
于 2017-08-19T02:36:43.447 に答える
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();
        }

    }

}
于 2015-04-20T09:07:29.940 に答える
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;
}
于 2018-03-25T16:06:09.710 に答える
1

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);
}
于 2020-05-18T09:25:09.237 に答える
0

これは、2次元行列を「インプレース」で転置するコードです(出力を保存するために別のデータ構造を使用しない)。したがって、メモリ効率が高くなります。

以下の同じアルゴリズムは、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;
    }
于 2021-06-17T23:16:34.450 に答える
-1

ここに小さな変更があります!

for (int j = i; j < m[0].length; j++)
于 2018-09-07T20:42:02.013 に答える