0

16997*15931*6 要素のベクトルがあります。これは、GDAL ライブラリの RasterIO 関数によって読み取られたラスターのさまざまなバンドであることがわかります。要素を 6 つの要素 (行) を持つ 2d ベクトルに格納し、各行には 16997*15931 要素が含まれます。16997*15931*6 を反復するループを作成し、i%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 画像を扱っているので、パフォーマンスの高いコードが必要です。したがって、より高速なアルゴリズムは歓迎されます。
ありがとう

4

2 に答える 2

0

アルゴリズムを最適化する前に、どこでアルゴリズムが遅いかを理解する必要があります。いくつかの提案:

  • something.push_back(data[i]); を呼び出します。.at(); を呼び出す代わりに 演算子はインデックスの境界をチェックしませんが、at() をチェックするため、わずかに高速です

  • ループが開始する前にベクトルのサイズを変更します。そのままでは、ベクターは成長するにつれてサイズが変更され、ループを通じて割り当て、コピー、解放が繰り返されます。これらは高価な操作になる可能性があり、開始前にサイズがわかっているため、事前割り当てによりオーバーヘッドを回避できます

  • ループの i%6 I 側を削除すると、比較的コストのかかる除算を何度も回避できるため、役立つ場合があります。

于 2013-07-19T21:33:15.873 に答える