如何将三维阵列映射到线性阵列

本文关键字:阵列 映射 线性 三维 | 更新日期: 2023-09-27 18:28:46

我有一个3D数据数组,它表示一堆2D数据。在这种特殊情况下,堆栈只包含一个元素。将此数据映射到线性数组的最快方法是什么

我计划采取以下方法:

public static int[] ToBuffer<(this int[, ,] buffer3D, int w, int h)
  {
      int[] buffer = new int[w * h * 1];
      for (int i = 0; i < (w * h); i++)
      {
          buffer[i] = buffer3D[(int)Math.Floor(i / (double)w), i % w, 0];
      }
      return buffer;
   }

但我突然想到,可能有一些方法可以利用数据已经存储在内存中的方式。csharp中是否应该采用其他映射方法?

如何将三维阵列映射到线性阵列

我想,为新数组创建新的缓冲区并复制3d数组的缓冲区应该可以工作:

public static int[] ToBuffer(int[, ,] buffer3D, int w, int h) {
    int[] buffer = new int[w * h * 1];
    Buffer.BlockCopy(buffer3D, 0, buffer, 0, w * h * sizeof(int));
    return buffer;
}

虽然您可能在这里使用一些Linq,但.ToArray()函数在内部使用一个设置大小的数组,然后在数组太大时将其替换,这与已经发布的代码相比效率不高。(参见:引用源上的类可枚举)

请注意,C#的主要优势,内存管理,也是它对此类优化的主要缺点——由于指针等都是高度管理的,因此在C#中以这种方式访问它们以优化此类代码通常比其他语言困难得多。