今天我遇到了麻烦。我有一个特殊的索引向量P,和一个矩阵A。例如:
MatrixXd B = MatrixXd::Ones(10, 10);
std::cout << B;
std::vector<int> P = { 1, 6, 3, 7, 5 };
并且我想更改 B 行的值。哪些行的索引不在 P 中;在这种情况下,我想对第 0,2,4,5,8,9 行执行一些操作。
但是如何通过 eigen 有效地得到它?
Eigen 的使用对于这个问题来说是次要的。主要问题是您需要找到
[0, B.rows())
范围内但不在 P
范围内的所有索引。从表面上看,P
没有排序,这是不幸的。我认为它至少是唯一的,因为这可以节省我们的一些记忆。
这是一个优化为快速而非美观的版本。
std::vector<int> indices_not_in(const std::vector<int>& P, int end)
{
assert(P.size() <= end);
std::vector<bool> inP(end);
for(int pi: P) {
assert(inP[pi] == false && "Duplicate entry");
inP[pi] = true;
}
std::vector<int> notP(inP.size() - P.size() + 1);
auto cur = notP.begin();
int i = 0;
for(bool inPi: inP) {
*cur = i++;
cur += ! inPi;
}
notP.erase(cur, notP.end());
return notP;
}
int main()
{
Eigen::MatrixXd B = Eigen::MatrixXd::Ones(10, 10);
std::cout << B << "\n\n";
std::vector<int> P = { 1, 6, 3, 7, 5 };
std::vector<int> notP = indices_not_in(P, B.rows());
B(notP, Eigen::all) *= 2.;
std::cout << B << "\n";
}