2015-04-07 27 views
0

我需要知道每個元素在推力緊湊時映射到什麼位置。如何在推力緊湊時獲得映射陣列

例如:

arr:  5 2 -1 3 -1 6 -1 7 
compacted: 5 2 3 6 7  --------------(remove all -1 element) 
map Arr: 0 1 -1 2 -1 3 -1 4 

映射陣列,這裏我指的是數組,指示哪個位置,每個元件被移動到,對不起,我無法想出一個更好的名稱來描述這一點,我希望我說清楚。

緊湊與推力很容易,但我想知道如果我可以得到該映射陣列,而推力是壓實。

+0

通過 '壓縮' 你的意思是源數組中取出'-1'條目? –

+0

@ m.s。是的,對不起,我應該添加更多描述 – Wood

回答

1

以下推力調用序列可以生成所需的映射數組。

您的示例中的輸出是:

compacted: 5 2 3 6 7 
map: 0 0 -1 0 -1 0 -1 0 
map: 0 0 -1 -1 -2 -2 -3 -3 
map: 0 1 1 2 2 3 3 4 
map: 0 1 -1 2 -1 3 -1 4 

#include <iostream> 
#include <string> 

#include <thrust/scan.h> 
#include <thrust/scatter.h> 
#include <thrust/remove.h> 
#include <thrust/iterator/counting_iterator.h> 
#include <thrust/iterator/constant_iterator.h> 

void print(const std::string& name, int* begin, int* end) 
{ 
    std::cout << name << ": "; 
    thrust::copy(begin, end, std::ostream_iterator<int>(std::cout, " ")); 
    std::cout <<std::endl; 
} 

struct is_marker 
{ 
    __host__ __device__ 
    bool operator()(const int x) const 
    { 
    return (x == -1); 
    } 
}; 

int main() 
{ 
    const int N = 8; 
    int arr[N] = {5,2,-1,3,-1,6,-1,7}; 

    int compacted[N] = {0}; 
    int* compacted_end = thrust::remove_copy(arr, arr+N, compacted, -1); 
    print("compacted", compacted, compacted_end); 

    int map[N] = {0}; 
    thrust::scatter_if(thrust::make_constant_iterator(-1), thrust::make_constant_iterator(-1)+N, thrust::make_counting_iterator(0), arr, map, is_marker()); 
    print("map", map, map+N); 

    thrust::inclusive_scan(map, map+N, map); 
    print("map", map, map+N); 

    thrust::transform(map, map+N, thrust::make_counting_iterator(0), map, thrust::plus<int>()); 
    print("map", map, map+N); 

    thrust::scatter_if(thrust::make_constant_iterator(-1), thrust::make_constant_iterator(-1)+N, thrust::make_counting_iterator(0), arr, map, is_marker()); 
    print("map", map, map+N); 

    return 0; 
} 
+1

[Here](http://pastebin.com/FLNjLQVv)是另一種類似的方法。 –

+0

@RobertCrovella:你的方法當然看起來更有效率! –

+0

@RobertCrovella:你總是那麼棒! :-) – Wood