Определение наименьшего элемента и его положения в каждом столбце матрицы с помощью CUDA Thrust
У меня довольно простая проблема, но я не могу найти элегантного решения.
У меня есть код Thrust, который выдаетc
векторы одинакового размера, содержащие значения. Скажем, каждый из этих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
элементы и там может быть гораздо больше, чем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)
Однако как написать такой функтор для операции сокращения по ключу?