2012-10-18 90 views
3

我想知道是否有一種聰明的方式將矢量中的信息呈現爲一維數組。例如: 讓我們創建5X3 INT元件矢量到1D數組的矢量

vector< vector<int>> iVector; 
ivector.resize(5); 
for(i = 0; i < 5; i++){ 
    iVector[i].resize(3); 
} 

但現在我想這種結構的載體的一個矢量被轉換成一維數組:

int* myArray = new int[5*3]; 

所以,我可以訪問哪些我希望每個元件如下:

for (i =0;i < 5; i++) 
    for(j =0; j< 3; j++) 
     myArray[i*3+j] = ... 

我知道我可以只載體複製到由元件陣列元件,但我想知道如果存在直接處理的方法矢量數組轉換。我也知道這個矢量可以用iVector[i][j]來表示,但不幸的是它需要是一個數組,因爲它將被髮送到GPU,而GPU不理解矢量。

+0

這是不是你的問題的答案,但你有沒有嘗試使用一個矢量而不是矢量矢量?您可以安排模擬2D陣列的訪問。以這種方式,將矢量複製到數組很簡單 – undefined

+0

2D訪問有什麼問題:'iVector [i] [j]'? – PiotrNycz

+0

@PiotrNycz:沒有什麼不對,但它不可能用於GPU設備 – Manolete

回答

1

載體應該元素存儲在一個線性的方式,所以理論上你可以參考整個基礎載體(只有一個向量):

std::vector<int> numbers; 
int data[4] = &(numbers[0]); 

相若方式,也許你可以嘗試同樣的方法2D版本。 但是在你的地方,我會考慮使用專門設計用於處理矩陣A類(很容易寫一個類似的std ::向量()。

2

只需使用std::copy 5倍。

int* ptrArray = myArray; 
for (i =0;i < 5; i++) { 
    std::copy(iVector[i].begin(), iVector[i].end(), ptrArray); 
    ptrArray += iVector[i].size(); 
} 
2

沒什麼好說的,你可以在這裏做,除了它複製到一個數組,GPU將任何不理解的抽象您創建的任何超過它能夠理解std::vector。你所能做的就是讓一個數組,複製過來。

0

或者你可以使用普通的老式C.

您首先將數組大小初始化爲行數*矢量向量的列數。然後使用memcpy將每個向量複製到數組中。

vector<vector<int> > v = { {1,2},{3,4},{5,6} }; //v is 3 by 2 matrix 
int *arr = (int*)malloc((3*2) * sizeof(int)); // arr has size 3*2 = 6 
for (int i = 0; i < 3; i++) 
    memcpy(arr + v[i].size() * i, &(v[i][0]), v[i].size() * sizeof(int)); 

下面是我寫的,這是否給你一個函數:

template<typename T> 
T *vectorToArray(vector<vector<T> > const &v) { 
    T *rv = (T*)malloc((v.size()*v[0].size()) * sizeof(T)); //Assuming all rows have the same size 
    for (unsigned i = 0; i < v.size(); i++) 
     memcpy(rv + v[i].size() * i, &(v[i][0]), v[i].size() * sizeof(T)); 
    return rv; 
} 

所以現在你可以做這樣的事情:

vector<vector<int> > v = { {1,2},{3,4},{5,6} }; //v is 3 by 2 matrix 
int *arr = vectorToArray(v); 

我希望這有助於