我在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;
}
}
但它真的很慢。
有没有办法加快?
答案 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;
}
}
}