在Java中可以对M*N矩阵进行就地矩阵转置吗?我认为这在Java中是不可能的,因为在3*5矩阵中,在3*5处的元素最好是在5*3处与元素交换,但这样的位置并不存在。也就是说,C/C++是可能的,因为内存是连续的。
此外,还有其他算法,比如发布的M*N矩阵的这里算法,我认为这些算法不适用于Java,但是它与在Ai上用Aj交换元素有什么不同,因为上面链接中的滚动窗口算法都需要辅助内存?
发布于 2016-08-02 17:50:14
你得小心这个词。严格地说,转置算符“创建”了一个具有潜在新维度的新矩阵。在您所链接的文章中,就地只意味着对初始矩阵和最终矩阵使用相同的内存,当然,使用巧妙的表示是可能的。
一个简单的解决方案可能是:
public class Matrix {
private int[][] backingArray;
private boolean transposed;
public Matrix(int[][] _backingArray) {
this.backingArray = _backingArray
}
public Matrix(int[] data, rows, columns) {
backingArray = new int[rows][columns]
for (int i = 0; i < rows; i++)
for (int j = 0; j < columns; j++)
backingArray[i][j] = data[i*columns + j]
}
public int getElement(i, j) {
if (transposed)
return backingArray[j][i];
return backingArray[i][j];
}
public void transpose() {
transpose = !transpose;
}
}
编辑:纠正了一些错误的语法
编辑:这样就可以按照操作问题(?)读取一维矩阵。
发布于 2016-08-02 17:39:17
在Java中,一旦创建了一个数组,它的长度是固定的。所以,如果M和N是不同的,你就不能交换它们
https://stackoverflow.com/questions/38726997
复制相似问题