如何在 Eigen C++ 中有效地定位大向量的不同段?

计算科学 C++ 本征 向量
2021-12-05 22:08:57

VectorXi在 Eigen C++ 中定义了一个非常大(最多 9 000 000)的向量,它是从数据文件中读取的。

该向量由 0, 1, 2, ...n 段组成,长度随机,如下所示:

[0 0 ... 0 1 1 1 ... 1 2 2 ...2 3 ... 3 ... k k ... k k+1 k+1 ... k+1 .... n n ...n]

我需要计算每个段的长度并将它们存储到一个新的n+1VectorXi 中,并索引每个段的起始位置,该位置也存储到一个新的n+1VectorXi 中。

我怎样才能更快地实施它?我发现有时我可能需要 1 个小时左右才能完成它!

1个回答

这是大数组的大小在O(m)哪里的问题。m所以这应该很快:

int n = v[v.size()-1];
int k=0;
VectorXi lengths[n+1], starts[n+1];
for(int i=0; i<v.size(); ++i) {
  int i0 = i;
  while(v[i]==k && i<n) ++i;
  lengths[k] = i-i0;
  starts[k] = i;
  ++k;
}