【发布时间】:2017-07-21 16:06:07
【问题描述】:
我有一个函数可以将 1d 数组 (double[]) 作为参数,而我的源数据是 2d 数组 (double[,]) 的“cnt”个 3d 点,就像这样
double[,] points = new double[3,cnt]
但我真正想做的是将三个 2nd dim 数组中的每一个传递给函数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 并行库的一个很好的示例,这只是一个比较不同数据类型和结构的执行时间的测试用例)。
// 罗尔夫
【问题讨论】:
-
不,但是如果您使用嵌套数组 (
[][]) 而不是二维数组 ([,]),那么您可以。 -
嗯。但是嵌套数组可以分配动态长度吗?我在想
double[3][someList.Count]; -
如果你非常幸运,那么你的方法将会有一个重载,它需要一个 double* 而不是一个数组。然后你就可以这样做了。
-
它们可以随意分配,但它比二维数组更多的代码。你必须显式地创建每个数组,所以你需要一个 for 循环。
-
您可以固定数组并覆盖其对象头,使其看起来像一个适当长度的一维数组(对于第一个数组)。对于后面的数组,您可以临时覆盖先前数组的最后一个元素,然后使用一些 CIL 代码重新解释将您写入的方法表指针转换为一维数组类型的托管引用。