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

时间:2016-09-20 13:37:39

标签: c# arrays for-loop multidimensional-array

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

是否有一种简单的方法可以使用我的2 x 10000 x 4000 3D阵列并创建尺寸为10000 x 4000的2D阵列?这可以没有进行for循环吗?是否有复制功能或类似功能允许我将单个维度(或多个)的数组元素复制到一个全新的数组中?

4 个答案:

答案 0 :(得分:2)

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

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时有点过分。不要让自己太难。改为使用循环。

答案 1 :(得分:0)

我曾经为完整数组创建一个控制台命令,不知道它会如何变成锯齿状数组。

你可以试试。

代码段:

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]);

答案 2 :(得分:0)

如果您的操作是只读的,则可以使用函数参数选择维度。让你的数组如下:

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

如果你需要在其中书写,那么你就可以使用数组的一部分副本。在这种情况下,没有办法用循环复制。

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

答案 3 :(得分:0)

实际上我总是喜欢单维数组。其他人的表现只是bad。 其他一切都可以用数学来完成,你可以创建自己的类来轻松切换3D,2D甚至1D。

这可以消除您的问题,只需要一点额外的写作。