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

标签 java matrix reference

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

附:该函数必须为“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;

在这里您将链接分配给数组 b到数组 a 的链接(此链接是局部变量)。

要么应该复制数组而不是分配链接,要么应该使用初始数组 a循环内。当然,如果矩阵是二次的( n x n ),这一切都是可能的。

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

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

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

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

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

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

关于java - 如何在java中通过引用转置矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29153160/

相关文章:

java - 为什么创建一种类型的引用变量但将其分配给另一种类型?

java - 解析数据时出错 org.json.JSONException : Value of type java. lang.String 无法转换为 JSONArray

matlab - 随机唯一整数值

java - 如何将参数从控制台传递给不同的方法?

java - 没有 IDE 时如何在项目中添加/引用 .jar 文件

java - Jackson 将字符串反序列化为参数化映射

Java:我可以创建通用类型的静态类吗?

matlab - 是否有一个将矩阵作为 `val` 的 accumarray() ?

python - 如何在 Python 中手动创建稀疏矩阵

java - 使用线程更新 ArrayList 对象实例的好方法是什么?