重新排序多维数组的元素



我在Java中寻找一种高效且快速的方法来排列多维数组的维度。

我的意思是将数组double[rows][cols][slices]转换为数组double[slices][rows][cols](与此Matlab函数相比),我知道所有行元素具有相同数量的cols,并且所有cols具有相同数量的切片。

我总是在单独的切片上工作,这使得double[rows][cols][slices]数组非常不方便。我考虑创建一个getSlice(double[][][] array, int slice)函数,但是我的数组大小为几个GB,并且我非常频繁地访问这些片。所以这似乎是太多的冗余工作。

明确我的问题:在速度和内存使用方面,是否有比创建新数组并逐个元素复制旧数组更好的排列数组维度的方法?或者是否有一种完全不同的、更优雅的方法来解决这个问题,而我至今还没有找到?

现在我按照建议封装了数据。为此,我还使用了ImageJ中的ImagePlus、ImageStack和ImageProcessor类,因为它们已经提供了我需要的大部分功能。从内存效率的角度来看,它们似乎是OK的。

由于您没有给出有关如何使用数据的任何信息,因此这可能不相关,但我建议将数据封装在一个类中,以便永远不会直接访问数据。

您可以使它特定于您的情况,或更通用。我将显示generic

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数据的"视图"。

相关内容

  • 没有找到相关文章

最新更新