如何在 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
。当然,如果矩阵是二次矩阵 (n
xn
).
,这一切都是可能的
复制一个数组(无效的方式!)看起来像:
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();
}
}
我尝试通过引用转置矩阵,但没有成功,主矩阵保持相同状态。我能做什么?
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
。当然,如果矩阵是二次矩阵 (n
xn
).
复制一个数组(无效的方式!)看起来像:
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();
}
}