Java:重新排列多维数组的元素

时间:2015-10-07 16:10:40

标签: java arrays multidimensional-array

我在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类,因为它们已经提供了我需要的大部分功能。从记忆效率的角度看,它们似乎没问题。

1 个答案:

答案 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的实现类将包含实际数据。 Array2DArray1D的实施类不会包含任何数据,因为它们是"观看"到3D数据上。