在特征中置换稀疏矩阵

时间:2015-01-10 19:04:18

标签: matrix permutation eigen sparse-matrix

我想在Eigen中置换稀疏矩阵的行和列。这是我的代码,但它不起作用。

#include <iostream>
#include <Eigen/Core>
#include <Eigen/SparseCore>
typedef Eigen::SparseMatrix<double> SpMat;
using namespace Eigen;
using namespace std;

int myrandom (int i) { return std::rand()%i;}
int main() {
    PermutationMatrix<Dynamic,Dynamic> perm(5);
    MatrixXd x = MatrixXd::Random(5,5);
    SpMat y = x.sparseView();
    int dim=5;
    perm.setIdentity();
    for (int i=dim-1; i>0; --i) {
        swap (perm.indices()[i],perm.indices()[myrandom(i+1)]);
    }
    cout << "permutation\n" << perm.indices() << endl << endl;
    cout << "original x\n" << y << endl << endl;
    cout << "permuted left x \n" << perm * y << endl << endl;
    cout << "permuted right x \n" << y * perm << endl << endl;
    cout << "permuted both x \n" << perm * y * perm << endl << endl;
}

它会置换行并置换列,但它不会同时执行这两行。有谁知道如何对列和行进行置换?

感谢。

1 个答案:

答案 0 :(得分:0)

如果您想应用对称排列P * Y * P^-1,那么最好使用twistedBy方法:

SpMat z = y.twistedBy(perm);

否则你必须申请一个,然后另一个:

SpMAt z = (perm * y).eval() * perm;