如何将三维阵列映射到线性阵列
本文关键字:阵列 映射 线性 三维 | 更新日期: 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#中以这种方式访问它们以优化此类代码通常比其他语言困难得多。