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