如何通过 Eigen 遍历不在特殊索引向量 P 中的索引的矩阵行?

问题描述 投票:0回答:1

今天我遇到了麻烦。我有一个特殊的索引向量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 有效地得到它?

c++ matrix indexing eigen
1个回答
0
投票

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";
}
© www.soinside.com 2019 - 2024. All rights reserved.