2015-01-10 10 views
0

Eigen에서 희소 행렬의 행과 열을 바꾸고 싶습니다. 여기에 코드가 있지만 작동하지 않습니다.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; 
} 

행을 순차적으로 바꾸고 열을 바꾸지 만 두 가지를 모두 수행하지는 않습니다. 누구든지 어떻게 열과 행을 대체 할 수 있는지 알고 있습니까?

감사합니다.

SpMat z = y.twistedBy(perm); 

그렇지 않으면, 당신은 하나를 적용한 다음 다른 :

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

답변

0

당신이 대칭 순열 P * Y * P^-1을 적용 할 경우

후 최고는 twistedBy 방법을 사용하는 것입니다. 내가 원했던 것은 대칭적인 순열을 적용하는 것이 었습니다. 하지만 문제는 결국`Eigen :: SparseSymmetricPermutationProduct z = y.twistedBy (perm);`를 얻는 것입니다. 내가 그것을 바꿀 수 있도록 어떻게 바꿀 수 있는지 아십니까? 또는 y 자체를 수정할 수없는 경우 어떻게 치환 된 y를 얻을 수 있습니까?
+0

감사를 – user4440672

+0

나는 그것을 이해했다. 새로운 변수를 만들고 evalTo를 사용할 수 있습니다 :'SpMat k; z.evalTo (k)'. 나는'z.evalTo (y)'를 수행하면 오류가 있는지 궁금합니다. 그리고 이러한 작업 중 어느 것이 얼마나 시간과 메모리면에서 얼마나 효율적인지 알 수 있습니다. 감사. – user4440672

관련 문제