我有一个函数,可以将一维数组 (double[]
) 作为参数,而我的源数据是一个二维数组 (double[,]
) 'cnt' 3d 点的数量,就像这样
double[,] points = new double[3,cnt]
但我实际上想做的是将三个第二个暗淡数组中的每一个传递给函数gpu.Average(double[] arg)
,最好不必复制按 value[i] 排列 value[i]。这在 C# 中可能吗?
示例代码
这有效:
double[] points1d = new double[cnt];
// ... fill points1d with data, then
double a = gpu.Average(points1d); // <- Alea.gpu.Average() accepts a 1d array
但如上所述,我想将第二个维度传递给函数 gpu.Average() ,而不必运行 for 循环三次来复制到一维数组中:
double[,] points2d = new double[3,cnt];
// ... fill points2d with 'cnt' items of data and
// then pass it on
double x = gpu.Average(points2d[0,??]); // How to pass on 2nd dim?
double y = gpu.Average(points2d[1,??]);
double z = gpu.Average(points2d[2,??]);
这是否可能无需将数据复制到一维数组中?
(顺便说一句,计算平均值并不是 GPU 并行库的一个很好的使用示例,这只是一个比较不同数据类型和结构的执行时间的测试用例)。
//罗尔夫
最佳答案
不,如果不复制例如的内容,这在托管代码中是不可能的。 points2d[1,*]
到一个新的单维数组。
在托管代码中,每个数组都必须知道其长度,以便可以检查每个索引访问,如果索引越界,则抛出 ArrayIndexOutOfBounds 异常。长度(整数值)存储在数组的第一个元素之前,以便运行时知道在哪里找到它。现在,我想人们可以明白为什么不能将数组分成几个部分并将它们视为新数组。请注意,对于多维数组来说,情况更加复杂,它必须存储维度数和每个维度的大小......
你可以做的是使用锯齿状数组:
double[][] points2d = new double[3][];
points2[0] = new double[cnt];
...
gpu.Average(points2d[0]);
交错数组比多维数组更快,建议使用交错数组代替多维数组 even by MS .
关于C# 第二维数组到一维数组的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242178/