如何在eigen3 SparseMatrix中交换列

时间:2016-06-03 11:22:47

标签: eigen eigen3

在ColMajor eigen SparseMatrix中交换列的有效方法是什么?

我尝试了以下内容:

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))

1 个答案:

答案 0 :(得分:2)

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

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并应用一次(或直接计算唯一排列)。