我有一个函数可以使用1d数组(double[]
)作为参数,而我的源数据是2d数组(double[,]
)的' cnt' 3d点的数量,如此
double[,] points = new double[3,cnt]
但我真正想做的是将三个第二个dim数组中的每一个传递给函数gpu.Average(double[] arg)
,最好不必通过值[i]复制数组值[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循环三次以复制到1d数组中:
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,??]);
这可以在不必将数据复制到1d数组的情况下实现吗?
(顺便说一句,计算平均值不是gpu并行库的一个很好的例子,这只是比较不同数据类型和结构的执行时间的测试用例)。
// Rolf
答案 0 :(得分:2)
如果没有复制例如的内容,托管代码中就无法做到这一点。 points2d[1,*]
到一个新的单维数组。
在托管代码中,每个数组都必须知道它的长度,以便在索引超出范围时可以检查每个索引访问并抛出ArrayIndexOutOfBounds
异常。长度(整数值)存储在数组的第一个元素之前,以便运行时知道在哪里找到它。现在有了这个,我想可以看出为什么你不能将数组分成几个部分并将它们视为新数组。请注意,对于多维数组而言,故事更加复杂,多维数组必须存储维度的数量和每个维度的大小...
你可以做的是使用锯齿状阵列:
double[][] points2d = new double[3][];
points2[0] = new double[cnt];
...
gpu.Average(points2d[0]);
Jagged数组比多维数组更快,建议使用它而不是多维数组even by MS。