2016-01-17 80 views
2

我有一個二維矩陣,其列大小在每次迭代後增加,但行大小保持不變。對於每次迭代,函數都會返回一個我想水平堆疊的矩陣。以下是我嘗試的代碼,但我認爲我在big_mat [ii] .insert部分中做了錯誤的操作。但是我環顧四周,發現了垂直堆棧的代碼,您可以從big_mat.end()開始並執行插入操作。但我希望行大小保持不變。你能幫我解決這個問題嗎?最大最終尺寸也是1,000,000乘以5,000。水平連接std :: vectors的正確方法是什麼?

std::vector<std::vector<float> > big_mat; 
big_mat.reserve(fixed_row_dim); 

std::vector<std::vector<float> > small_mat; 

for (some condition){ 
    // small_mat is always fixed_row_dim x some_dim 
    small_mat = GetMat(params,fixed_row_dim); 
    for (int ii = 0; ii < fixed_row_dim; ii++){ 
     big_mat[ii].insert(big_mat[ii].end(),small_mat[ii].begin(),small_mat[ii].end()); 
    } 
} 
+0

「但我認爲我做錯了什麼」:你認爲什麼是錯的,爲什麼? – JohnB

+0

你的代碼有什麼問題?您是否意識到1,000,000 * 5,000 * sizeof(float)大約是20GB(因爲字節使用1024而不是1000,因此Kilo) – FrankM

+0

@JohnB我打算擴展提供的解決方案[here](http://stackoverflow.com/問題/ 201718/concatenating-two-stl-vectors)兩個維度。但是big_mat [ii] .insert可能不是正確的方法。所以我想我錯了。 @ FrankM是的,我知道這一點。代碼將在羣集上運行。因此,對於每個作業ID,生成的數據的大小將線性減小,因爲第一批將比較0到N-1之間的相似度,然後是1到N-1之間的相似度,同樣如此。我目前正在測試一對。 – sm176357

回答

2

我試圖編譯你的代碼,當然必要的版本,它工作得很好。那麼問題是什麼,你會得到什麼樣的錯誤?

int main() { 
    std::vector<std::vector<float> > big_mat; 
    big_mat.reserve(5); 

    std::vector<std::vector<float> > small_mat; 

    for (int i = 0; i < 10; i++){ 
    // small_mat is always fixed_row_dim x some_dim 
    std::vector<float> example = { 1, 2, 3, 4, 5 }; 
    std::vector<std::vector<float>> small_mat; 

    for (int ii = 0; ii < 5; ii++) { 
     small_mat.push_back(example); 
    } 
    for (int ii = 0; ii < 5; ii++){ 
     big_mat[ii].insert(big_mat[ii].end(), small_mat[ii].begin(), small_mat[ii].end()); 
    } 
    } 
} 

但是我得到試圖運行在Visual Studio 2013的代碼的原因是big_mat是「調試斷言失敗」錯誤了空阱尺寸比迭代次數少。

big_mat.reserve(5); 

到:從改變big_mat初始化

for (int ii = 0; ii < 5; ii++) { 
    big_mat.push_back(*(new std::vector<float>())); 
    } 

固定的問題。我認爲這是你的代碼的問題。我將嘗試獲取有關std::vector::reserve函數的一些信息,並在接下來的幾分鐘內向您解釋。

編輯: @Zereges指出。二維向量的初始化提出的方式會導致內存泄漏,要實現這一目標安全和更性感的方式是:

std::vector<std::vector<float> > big_mat { 5, std::vector<float>{0f} } 

說明:,你可以在documentation讀取時,reserve功能

請求向量容量至少足以包含n個元素。

只是保證給定大小的向量將適合內存而不需要重新分配。它不初始化任何東西,所以你的矢量向量是空的,你試圖在你的循環中迭代它。

+1

'big_mat.push_back(*(new std :: vector ()));'導致內存泄漏。使用'std :: vector > big_mat {5,std :: vector {0f}}'用'0f'初始化vector# – Zereges

+0

@Dominik,很好的解釋和謝謝編輯。 –

+0

Zerges謝謝你指出並給出適當的選擇。 @GeorgeNetu感謝:) – Dominik

相關問題