我在Java中搜索一种内存高效且快速的方法来置换多维数组的维度。
我的意思是将数组double[rows][cols][slices]
转换为数组double[slices][rows][cols]
。(与this Matlab function相当)我知道所有行元素都具有相同数量的cols和所有cols具有相同数量的切片。
我总是处理单个切片,这使得double[rows][cols][slices]
数组非常不方便。我考虑创建一个getSlice(double[][][] array, int slice)
函数,但我的数组大小为几GB,我经常访问切片。所以这似乎是多余的工作。
准确地说我的问题: 在速度和内存使用方面,是否有更好的方法来置换数组维度,而不是创建一个新的数组并按元素复制旧的元素?或者到目前为止,我是否还有一种完全不同且更优雅的方法来解决这个问题?
ANSWER 我现在按照建议封装了数据。为此,我还使用了来自ImageJ的ImagePlus,ImageStack和ImageProcessor类,因为它们已经提供了我需要的大部分功能。从记忆效率的角度看,它们似乎没问题。
答案 0 :(得分:0)
由于您还没有提供有关如何使用数据的任何信息,这可能不相关,但我建议将数据封装在一个类中,以便永远不会直接访问数据。 / p>
您可以使其特定于您的案例,或更通用。我将展示通用。
public interface Array3D {
public double get(int x, int y, int z);
/**
* Returns a 2D view of the 3D plane for the given X, mapping (y,z) to (x,y).
*/
public Array2D forX(int x);
/**
* Returns a 2D view of the 3D plane for the given Y, mapping (x,z) to (x,y).
*/
public Array2D forY(int y);
/**
* Returns a 2D view of the 3D plane for the given Z.
*/
public Array2D forZ(int z);
}
public interface Array2D {
public double get(int x, int y);
/**
* Returns a 1D Y-axis view of the 2D plane for the given X.
*/
public Array1D forX(int x);
/**
* Returns a 1D X-axis view of the 2D plane for the given Y.
*/
public Array1D forY(int y);
/**
* Copies the data. Use sparingly.
*/
public double[][] toArray();
}
public interface Array1D {
public double get(int index);
/**
* Copies the data. Use sparingly.
*/
public double[] toArray();
}
Array3D
的实现类将包含实际数据。 Array2D
和Array1D
的实施类不会包含任何数据,因为它们是"观看"到3D数据上。