Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#第二个dim阵列到1d阵列的参考_C#_Arrays - Fatal编程技术网

C#第二个dim阵列到1d阵列的参考

C#第二个dim阵列到1d阵列的参考,c#,arrays,C#,Arrays,我有一个函数,它可以将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]; // ..

我有一个函数,它可以将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并行库的一个好例子,这只是一个比较不同数据类型和结构的执行时间的测试用例)


//Rolf

否在托管代码中,如果不将点2D[1,*]的内容复制到新的一维数组中,这是不可能的

在托管代码中,每个数组都必须知道其长度,以便可以检查每个索引访问,并在索引超出范围时引发异常。长度(整数值)存储在数组的第一个元素之前,以便运行时知道在哪里可以找到它。现在,我想大家可以明白为什么不能将数组拆分为几个部分,并将它们视为新数组。请注意,多维数组的情况更为复杂,它必须存储维度的数量和每个维度的大小

您可以使用锯齿阵列:

double[][] points2d = new double[3][];
points2[0] = new double[cnt];
...
gpu.Average(points2d[0]);

锯齿状数组比多维数组快,建议使用锯齿状数组代替多维数组。

否,但如果使用嵌套数组(
[]]
)代替二维数组(
[,]
),则可以使用.Hm。但是嵌套数组是否可以分配动态长度?我在考虑双倍[3][someList.Count];如果您非常幸运,那么您的方法将有一个重载,它将使用double*而不是数组。然后你可以这样做。它们可以按你喜欢的方式分配,但这比2D数组更像是代码。您必须显式创建每个数组,因此需要一个for-loop。您可以固定该数组并覆盖其对象标头,使其看起来像一个具有适当长度的一维数组(对于第一个数组)。对于后面的数组,您可以临时覆盖先前数组的最后一个元素,然后使用一些CIL代码重新解释并强制转换您写入的方法表指针到1D数组类型为+1的托管引用,尽管实际上可以使用托管代码执行此操作,但是,这样做所需的代码是残酷的,如果在执行这些恶作剧时发生GC,那么它将可怕地崩溃。当然,你可以在过程中阻止GC,但这不是为胆小的人准备的。你能链接到一个MS参考,说锯齿数组优于多维数组吗?不幸的是,代码无法编译。编辑:我将使用
double[][]点2d=newdouble[3][]进行测试不过。B好的,重复创建另外三个数组[3][…]是可行的。这与创建三个离散数组基本相同。在这种情况下,所有这些分配所需的时间比CPU直接完成任务所需的时间长10倍,但这种技巧在其他情况下可能会被证明是有用的。它是有效的,所以我会接受这个答案。谢谢!编辑:您可以将最后缺少的方括号添加到代码示例
newdouble[3][]尽管。:)@Blorgbeard,添加了参考
double[][] points2d = new double[3][];
points2[0] = new double[cnt];
...
gpu.Average(points2d[0]);