0

我有一个 16997*15931*6 元素的向量。您知道这是 GDAL 库的 RasterIO 函数已读取的栅格的不同波段。现在我想将元素存储到具有六个元素(行)的二维向量中,每行将包含 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

首先,您应该以最大程度的优化进行编译并测量当前代码的性能。它还可能取决于您使用的处理器。

如果真的要改的话,我建议你定义一个6个字符的struct,然后做struct assignment。你将有一个结构向量,然后你的循环可以像

for (i = 0; i < 16997*15931; i++)
    something.pushback(data.at(i));
于 2013-07-16T14:14:41.467 回答
0

您需要了解算法在哪里运行缓慢,然后才能对其进行优化。一些建议:

  • 调用 something.push_back(data[i]); 而不是调用 .at(); 运算符不检查索引边界,但 at(),因此速度稍快

  • 在循环开始之前调整向量的大小。实际上,向量将随着它的增长而调整大小,这将通过循环重复分配、复制、释放。这些可能是昂贵的操作,并且您在开始之前就知道大小,预分配可以避免开销

  • 消除循环中的 i%6 I可能有助于避免一遍又一遍地进行相对昂贵的除法

于 2013-07-19T21:33:15.873 回答