有效获取数组子集
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()
,这将是非常低效的。恕我直言,该方法不错,但不适合此目的。以上是关于有效获取数组子集的主要内容,如果未能解决你的问题,请参考以下文章
如何从每个区间 (0.0,0.2),(0.2,0.4),(0.4,0.8),(0.8,1.0) 中获取包含相等数量值的数组子集?