有效获取数组子集

Posted

技术标签:

【中文标题】有效获取数组子集【英文标题】:Getting array subsets efficiently 【发布时间】:2010-09-21 01:50:24 【问题描述】:

有没有一种有效的方法来获取 C# 数组的子集并将其传递给另一段代码(不修改原始数组)?我使用 CUDA.net,它具有将数组复制到 GPU 的功能。我想例如将数组的十分之一传递给函数,从而将数组的每十分之一分别复制到 GPU(出于流水线目的)。

以这种方式复制数组应该和一次性复制它一样有效。可以使用不安全的代码并仅引用正确的内存位置来完成,但除此之外我不确定。 CopyTo 函数将整个数组复制到另一个数组,因此这似乎没有用。

【问题讨论】:

【参考方案1】:

好的,我之前误解了这个问题。

你想要的是System.Buffer.BlockCopy 或System.Array.Copy。

LINQ 方法效率极低。如果您能够重复使用要复制到的缓冲区,那也将有助于提高效率,避免每次都创建一个新数组 - 只需复制顶部即可。除非你能将你的“大”数组平分,否则你需要一个新的来处理最后一种情况。

【讨论】:

【参考方案2】:

我不确定这有多有效,但是...

int[] myInts = new int[100];

//Code to populate original arrray

for (int i = 0; i < myInts.Length; i += 10)

    int[] newarray = myInts.Skip(i).Take(10).ToArray();
    //Do stuff with new array

【讨论】:

【参考方案3】:

如果您需要从字节数组转到非托管指针,您可以尝试 Marshal.Copy。这样可以避免自己创建不安全的代码。

编辑:这显然只有在您重新实现他们的 API 时才有效。抱歉——误会了。你想要一个高效的子数组方法。

令我震惊的是,您真正想要的是表单原始类中的 api

void CopyToGpu(byte[] source, int start, int length);

【讨论】:

【参考方案4】:

您可以使用扩展方法并产生返回:

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )

    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];

【讨论】:

这对某些目的来说很好,但效率不高,Array.Copy 会快得多。 在什么方面效率不高?如果你只想迭代数组的一部分,它比复制数组更有效。 对不起应该用正确的方式解释。对于迭代,您可能是对的,但是在使用 yield 时会发生很多操作。作者的问题是如何将数组的子集复制到gpu,当使用上述方法时,您需要调用ToArray(),这将是非常低效的。恕我直言,该方法不错,但不适合此目的。

以上是关于有效获取数组子集的主要内容,如果未能解决你的问题,请参考以下文章

获取数组的子集数组

获取数组的子集数组

Numpy数组获取不是NaN的数组的子集/切片

numpy,获取最大子集

如何从每个区间 (0.0,0.2),(0.2,0.4),(0.4,0.8),(0.8,1.0) 中获取包含相等数量值的数组子集?

在 C++ 中比较两个大型数据列表的有效算法是啥?