2013-07-16 106 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我的圈可能帮助下一遍又一遍地避免了相对昂贵的划分

相关问题