2013-06-12 51 views
0

我正在使用推力矢量。在推力鏡中重新排序鏡像

我在找一個優雅的方法重新排序用「鏡子」排序的推力矢量裝置(例如給定,無法找到,在推力任何功能)

舉例來說,假設我向量包含一個結構體,每個結構體包含若干個數字 我的矢量如下所示

[1,2] [5,4] [-2,5]  [6,1]  [2,6] 

鏡重排序操作後,我想收到以下矢量 (第1元件交換與第n個元素) (第i元素與Ni元素切換等)

[2,6] [6,1] [-2,5] [5,4] [1,2] 

在Thrust中有這樣做的優雅方式嗎?

順便說一句,我正在考慮給每個結構一個唯一的ID號碼,並根據這個數字排序,這樣我可以「鏡像」使用排序重新排序向量。

+0

請不要把標籤的稱號你的問題。這不是必要的。 [SO]有標籤,在標題中重複它們不僅是不必要的,它是不需要的。 – talonmies

+2

這不就是「推力::反向」嗎? –

+0

@Jared Hoberock,你是對的,它很簡單,就像是相反的,寫一個答案,我會設置你的答案爲正確答案.http://thrust.github.io/doc/namespacethrust.html#a076e8291a8d5a1748cc4623b8c758c93 – TripleS

回答

2

使用thrust::reverse

#include <thrust/device_vector.h> 
#include <thrust/reverse.h> 
#include <thrust/pair.h> 
#include <iostream> 

int main() 
{ 
    thrust::device_vector<thrust::pair<int,int> > vec; 

    vec.push_back(thrust::make_pair(1,2)); 
    vec.push_back(thrust::make_pair(5,4)); 
    vec.push_back(thrust::make_pair(-2,5)); 
    vec.push_back(thrust::make_pair(6,1)); 
    vec.push_back(thrust::make_pair(2,6)); 

    std::cout << "input: " << std::endl; 
    for(int i = 0; i < vec.size(); ++i) 
    { 
    thrust::pair<int,int> x = vec[i]; 
    std::cout << " [" << x.first << ", " << x.second << "]"; 
    } 
    std::cout << std::endl; 

    thrust::reverse(vec.begin(), vec.end()); 

    std::cout << "output: " << std::endl; 
    for(int i = 0; i < vec.size(); ++i) 
    { 
    thrust::pair<int,int> x = vec[i]; 
    std::cout << " [" << x.first << ", " << x.second << "]"; 
    } 
    std::cout << std::endl; 

    return 0; 
} 

輸出:

$ nvcc reverse.cu -run 
input: 
[1, 2] [5, 4] [-2, 5] [6, 1] [2, 6] 
output: 
[2, 6] [6, 1] [-2, 5] [5, 4] [1, 2] 
0

thrust::gather允許根據地圖(矢量)將源矢量元素任意複製到目的矢量元素。

這裏有一個工作例如:

#include <stdio.h> 
#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 
#include <thrust/gather.h> 
#include <thrust/sequence.h> 

#define DSIZE 7 

struct myStruct { 
    int x; 
    int y; 
}; 

int main(){ 

    // create input data 
    thrust::host_vector<myStruct> h(DSIZE); 
    for (int i=0; i< DSIZE; i++){ 
    h[i].x = 2*i; 
    h[i].y = (2*i)+1; 
    } 

    // create map 
    thrust::device_vector<int> map(DSIZE); 
    thrust::sequence(map.begin(), map.end(), DSIZE-1, -1); 

    //move to device 
    thrust::device_vector<myStruct> d = h; 
    thrust::device_vector<myStruct> d_result(DSIZE); 

    thrust::gather(map.begin(), map.end(), d.begin(), d_result.begin()); 

    //move to host 
    thrust::host_vector<myStruct> h_result = d_result; 

    for (int i = 0; i < DSIZE; i++){ 
    printf("result[%d].x = %d, result[%d].y = %d\n", i, h_result[i].x, i, h_result[i].y); 
    } 
    return 0; 
} 
+0

我認爲這個建議來自Jared Hoberock更簡單。 –