3D数组到2D数组-忽略一个维度

本文关键字:数组 一个 2D 3D | 更新日期: 2023-09-27 18:07:58

我有一个非常大的3D数组包含一些数据- 2 x 10000 x 4000。我将处理其中的一些数据,但我不需要知道第一个维度(2)。

是否有一个简单的方法来采取我的2 × 10000 × 4000 3D数组,并创建一个二维数组的尺寸10000 × 4000?可以在不经过for循环的情况下完成吗?是否有一个复制函数或类似的东西,允许我复制数组元素的单一维度(或多个)到一个全新的数组?

3D数组到2D数组-忽略一个维度

有一种方法,但我不会推荐它。这将使用不安全指针进行复制。(测试)

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]
    }
  }
}

如果您需要在其中写入,那么您使用数组部分的副本的方法是正确的。在这种情况下,没有办法不使用循环复制。

如果你的数组有一些特殊的结构,你可以确定(比如,它的一半是零,或者它类似于一个对称矩阵),你可以通过抓住这些属性来节省一些迭代。