如何有效地操纵很长的向量?

时间:2014-01-15 15:18:42

标签: c++ loops vector indexing

我在Eigen中有一个很长的向量,如下所示:

MatrixXi iIndex(1000000);

初始化为零,只有一个短的连续部分(小于100)填充1,其位置随机化。

我需要在长循环中执行以下操作:

int count;
int position;
for(int i=0;i<99999;i++){
  //... randomly fill iIndex will short `1` s
  // e.g. index = (someVectorXi.array() == i).cast<int>();
  count = iIndex.sum(); // count all the nonzero elements
  //position the first nonzero element index:
  for (int j=0; j<1000000;j++){
    if(iIndex(j))
    position = j;
  }
}

但它真的很慢。

有没有办法加快?

1 个答案:

答案 0 :(得分:1)

我的2美分:将比特分组为例如uint32_t,所以你可以检查i32是否与0不同。当它不同时,你可能需要更长的时间来找出哪些是1。

假设位数是32(使其更容易):

for (int i = 0; i < max / sizeof(uint32_t); ++i)
{
  if (wordGrp[i] != 0)
  {
    uint32_t grp = wordGrp[i];
    for (j = 0; j < BITS_PER_UINT32; j++)
    {
      if ((grp & 1) == 1) std::cout << "idx " << (i*32 + j) << " is 1\n";
      grp >>= 1;
    }
  }
}