2016-06-03 4 views
0

ColMajor 고유 SparseMatrix에서 열을 효율적으로 바꾸는 방법은 무엇입니까?eigen3에서 열을 바꾸는 방법 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))과 같은 것입니다.

답변

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))을 지원하기 위해 더 나은 것 ...

을 또한 수많은 스왑을 적용 할 경우, 더 나은 다음에 그들을 채우기 a Eigen::Transpositions, 그것을 Eigen::PermutationMatrix으로 변환하고 한 번 적용 (또는 고유 한 순열을 직접 계산).

+0

고마워요! 그래서 올바르게 이해한다면, 대입은 복사본을 만들고 그 행렬을 읽는 동안 행렬을 조작하기 때문에'H.col (i) = H.col (j);'행에 문제가 있습니까? 그렇다면 'H.col (i) - = H.col (j)'와 같은 내부 조작에도 동일한 문제가 존재합니까? – 1k5