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