2013-07-16 140 views
0

我有一個16997 * 15931 * 6元素的矢量。你知道這是由GDAL庫的RasterIO函數讀取的柵格的不同波段。現在我想將這些元素存儲到具有六個元素(行)的二維向量中,每行將包含16997 * 15931個元素。我知道,我可以有一個迭代循環* 16997 * 15931 6,評估我%6:將一個矢量的元素存儲到另一個矢量中

vector<vector<unsigned char> > bands(6,vector<unsigned char>) 
for(i=0;i<(6*16997*15931);i++) 
    bands[i%6].pushback(data.at(i)); 

但自從我與高分辨率圖像.TIFF工作,我需要高性能的代碼。所以任何更快的算法都會受到歡迎。
謝謝

回答

0

首先,你應該編譯最大優化和測量當前代碼的性能。它也可以取決於你使用的處理器。

如果你真的必須改變它,我建議你定義一個6字符的結構,並做結構分配。你將得到一個結構向量,然後你的循環可以像

for (i = 0; i < 16997*15931; i++) 
    something.pushback(data.at(i)); 
0

你需要了解算法在什麼地方慢,然後才能優化它。一些建議:

  • 調用something.push_back(data [i]);而不是調用.at();運算符不檢查索引邊界,但是在()處,因此速度稍快

  • 在循環開始之前調整向量的大小。事實上,矢量將隨着它的增長而調整大小,它將通過循環重複地分配,複製,自由。這些可以是昂貴的操作,如你所知的大小在開始之前,預先分配可避免的開銷

  • 省去了我%6我的圈可能幫助下一遍又一遍地避免了相對昂貴的劃分

相關問題