如何交换 eigen3 SparseMatrix 中的列

How to swap columns in eigen3 SparseMatrix

在 ColMajor 特征稀疏矩阵中交换列的有效方法是什么?

我试过以下方法:

SparseMatrix<mpz_class,ColMajor> H;
SparseVector<mpz_class> v;

// Somehow initialize H.

v = H.col(i);
H.col(i) = H.col(j);
H.col(j) = v;

我认为这是不正确的(我假设作业没有复制?)我实际上不明白为什么这不起作用,而例如以下内容似乎确实按预期工作:

v = H.col(i); w = H.col(j);
H.col(i) = s*v + t*w;  // s, t are some mpz_class elements.

实际有效的方法是:

SparseMatrix<mpz_class,ColMajor> H, H_;
PermutationMatrix<Dynamic,Dynamic> P;
P.setIdentity();
P.applyTranspositionOnTheRight(i,j);
H_ = H; H = H_ * P;

现在我假设复制了整个矩阵 H?所以我更喜欢第一种方法,或者一些有效的 H *= P 就地排列。或者类似 swap(H.col(i),H.col(j)).

第一个版本的问题是 H 在读取到 H.col(j) 对象(现在无效)之前被部分修改。您可以通过先复制两列来解决:

Hi = H.col(i);
Hj = H.col(j);
H.col(i) = Hj;
H.col(j) = Hi;

当然,对于稠密矩阵,支持H.col(i).swap(H.col(j))就更好了...

此外,如果你申请了很多交换,那么最好将它们填入Eigen::Transpositions,将其转换为Eigen::PermutationMatrix并应用一次(或直接计算唯一排列)。