如何在 java 中通过引用转置矩阵

how to transpose matrix by reference in java

我尝试通过引用转置矩阵,但没有成功,主矩阵保持相同状态。我能做什么?

p.s。函数必须是 "void"

谢谢!

 public static void trans(int a[][]) {
        int n = a.length;
        int m = a[0].length;
        int b[][] = new int[m][n];
        for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[0].length; j++) {
                b[i][j] = a[j][i];
            }
        }       
        a = b;
}
    public static void main(String[] args) {
        int a[][] = {{1,2,3},
                     {4,5,6}};  
        trans(a);

        System.out.println("*****************************");
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                System.out.print(a[i][j]+"\t");
            }
            System.out.println();
        }
    }

主要错误是行

a = b;

这里你把link赋给数组b赋给link赋给数组a(这个link是局部变量)

要么您应该复制数组而不是分配 link,要么您应该在循环中使用初始数组 a。当然,如果矩阵是二次矩阵 (nxn).

,这一切都是可能的

复制一个数组(无效的方式!)看起来像:

for (int i = 0; i < dim; ++i)
    System.arraycopy(b[i], 0, a[i], 0, dim);

数组内部的处理是这样的:

int dim = a.length;
assert a[0].length == dim; // quadratic

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

此外,如今不可变行为优于可变数组,因此您可以将函数 return 设为新数组而不是改变旧数组(您可以在@AlexFitzpatrick 的答案中找到解决方案)。

作为最后的想法,您可以将对数组的引用传递给方法。这可以通过一些包装器或内置 AtomicReference.

来实现

那么你的方法将接受的不是 int[][],而是 AtomicReference<int[][]>,所以它最终看起来像:

public static void trans(AtomicReference<int[][]> aWrapper) {
...
    int[][] a = aWrapper.get();
    for ...
        for ...
            b[i][j] = ...
    aWrapper.set(b);
}

trans 函数中的最后一行并没有替换原始数组的值,它只是重新分配了该函数中参数的指针。

最简单的解决方案是 return 新数组。

public static int[][] trans(int a[][]) {
    int n = a.length;
    int m = a[0].length;
    int b[][] = new int[m][n];
    for (int i = 0; i < b.length; i++) {
        for (int j = 0; j < b[0].length; j++) {
            b[i][j] = a[j][i];
        }
    }       
    return b;
}
public static void main(String[] args) {
    int a[][] = {{1,2,3},
                 {4,5,6}};

    int b[][] = trans(a);

    System.out.println("*****************************");
    for (int i = 0; i < b.length; i++) {
        for (int j = 0; j < b[0].length; j++) {
            System.out.print(b[i][j]+"\t");
        }
        System.out.println();
    }
}