3D数组到2D数组-忽略一个维度
本文关键字:数组 一个 2D 3D | 更新日期: 2023-09-27 18:07:58
我有一个非常大的3D数组包含一些数据- 2 x 10000 x 4000。我将处理其中的一些数据,但我不需要知道第一个维度(2)。
是否有一个简单的方法来采取我的2 × 10000 × 4000 3D数组,并创建一个二维数组的尺寸10000 × 4000?可以在不经过for循环的情况下完成吗?是否有一个复制函数或类似的东西,允许我复制数组元素的单一维度(或多个)到一个全新的数组?
有一种方法,但我不会推荐它。这将使用不安全指针进行复制。(测试)
int[,,] myArray = new int[2, 1000, 400];
int[,] myArray2 = new int[1000, 400];
var i = myArray.GetLength(1);
var j = myArray.GetLength(2);
var pageIndex = 0;
unsafe
{
fixed (void* source = &myArray[pageIndex, 0, 0])
fixed (void* dest = &myArray2[0, 0])
{
CopyMemory((IntPtr)dest, (IntPtr)source, (uint)(i*j*sizeof(int)));
}
}
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
我看到你正在创建一个json,这个方法在生成json时是过度的。别给自己太大的压力。
我曾经为完整数组创建一个控制台命令,不知道它将如何为锯齿数组。
你可以试试。
代码片段:
float[,] f = new float[3,3] { {1, 2, 3},
{4, 5, 6},
{7, 8, 9} };
float[,] g = new float[3,3];
Array.Copy(f, 0, g, 0, f.Length);
Console.WriteLine("{0} {1} {2}", f[0, 0], f[0, 1], f[0, 2]);
Console.WriteLine("{0} {1} {2}", f[1, 0], f[1, 1], f[1, 2]);
Console.WriteLine("{0} {1} {2}", f[2, 0], f[2, 1], f[2, 2]);
Console.WriteLine();
Console.WriteLine("{0} {1} {2}", g[0, 0], g[0, 1], g[0, 2]);
Console.WriteLine("{0} {1} {2}", g[1, 0], g[1, 1], g[1, 2]);
Console.WriteLine("{0} {1} {2}", g[2, 0], g[2, 1], g[2, 2]);
如果您的操作是只读的,您可以使用函数参数选择维度。让你的数组像这样:
float[,,] f = new float[2,10000,4000];
让你的操作符像这样:
void myOperation(float[,,] pArray, int p1stDimensionSelector) {
for (int i = ...; i < ...; i++) {
for (int j = ...; j < ...; j++) {
// do fancy stuff with pArray[p1stDimensionSelector, i, j]
}
}
}
如果您需要在其中写入,那么您使用数组部分的副本的方法是正确的。在这种情况下,没有办法不使用循环复制。
如果你的数组有一些特殊的结构,你可以确定(比如,它的一半是零,或者它类似于一个对称矩阵),你可以通过抓住这些属性来节省一些迭代。