我有一个非常大的3D数组包含一些数据 - 2 x 10000 x 4000.我将处理一些这些数据,但我不需要知道第一个维度(2)。
是否有一种简单的方法可以使用我的2 x 10000 x 4000 3D阵列并创建尺寸为10000 x 4000的2D阵列?这可以没有进行for循环吗?是否有复制功能或类似功能允许我将单个维度(或多个)的数组元素复制到一个全新的数组中?
答案 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。
这可以消除您的问题,只需要一点额外的写作。