我有一个相当简单的问题,但我无法想出一个优雅的解决方案。
我有一段产生包含值的相同大小的 c 向量的Thrust代码。假设这些 c 向量中的每个向量都有一个索引。我希望对于每个向量位置,获取值最低的 c 向量的索引:
例如:
C0 = (0,10,20,3,40)
C1 = (1,2 ,3 ,5,10)
我会得到一个向量,其中包含有最小值的
C
向量的索引:result = (0,1 ,1 ,0,1)
我考虑使用thrust zip迭代器来完成,但遇到了问题:我可以将所有 c 向量进行压缩,并实现一个任意转换,该转换接受一个元组并返回其最低值的索引,但是:
- 如何迭代元组的内容?
- 据我所知,元组只能存储多达
10 个元素,而可能有多个 c 向量。
然后,我考虑这样做:将所有 c 单独的向量附加到单个向量 C 中,然后生成引用位置的键,并通过键执行稳定排序,这将重新组合来自同一位置的向量条目。在示例中,将如下所示:
C = (0,10,20,3,40,1,2,3,5,10)
keys = (0,1 ,2 ,3,4 ,0,1,2,3,4 )
after stable sort by key:
output = (0,1,10,2,20,3,3,5,40,10)
keys = (0,0,1 ,1,2 ,2,3,3,4 ,4 )
然后使用向量中的位置生成键,将输出与c
向量的索引一起压缩,然后使用自定义函数执行按键减少,每个减少的输出都是具有最低值的索引。在这个例子中:
input = (0,1,10,2,20,3,3,5,40,10)
indexes= (0,1,0 ,1,0 ,1,0,1,0 ,1)
keys = (0,0,1 ,1,2 ,2,3,3,4 ,4)
after reduce by keys on zipped input and indexes:
output = (0,1,1,0,1)
然而,如何为按键缩减操作编写这样的函数对象呢?