2016-06-16 4 views
4

Eigen을 사용하면 Matrix3Xd (3 행, n 열)가 있습니다. 내가대각선 행렬의 고유 사용

가 명확하게 모든 컬럼의 제곱 규범을 좀하고 싶습니다, 내가 원하는 각 열의 제곱 규범

squaredNorms = 
5 10 5 17 

을 좀하고 싶습니다 내가

Matrix3Xd a = 
1 3 2 1 
2 1 1 4 

이 있다고 할 수 있습니다 직접 계산을 수행하는 for 루프를 거치지 않고 행렬 계산을 활용할 수 있습니다.

은 내가 생각의 것은

squaredNorms = (A.transpose() * A).diagonal() 

이 작동했다,하지만 난 성능 문제를 두려워 : 난 단지 대각선을 필요로 할 때 A.transpose() * A이, (잠재적으로 만 요소)를 NXN 행렬을 할 것이다.

Eigen은 내가 필요한 계수만을 계산할만큼 충분히 똑똑합니까? 각 열에서 squareNorm 계산을 수행하는 가장 효율적인 방법은 무엇입니까?

+1

[요소 별 곱셈] (https://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html#title4) (['.array()'] 사용 (https://eigen.tuxfamily.org) /dox/group__TutorialArrayClass.html#title6)) 부분 축소 ['.colwise()'] (https://eigen.tuxfamily.org/dox/group__TutorialReductionsVisitorsBroadcasting.html#title5) ['.sum()'] (https://eigen.tuxfamily.org/dox/group__TutorialReductionsVisitorsBroadcasting.html)? – rhashimoto

답변

6

대각선보기에 중첩 된 제품 표현의 지연 평가를 시행하기 위해 (A.transpose() * A).diagonal()의 케이스가 Eigen에 의해 명시 적으로 처리됩니다. 따라서 대각선 계수가 필요한 것은 n입니다.

그렇다면 Eric이 언급 한 A.colwise().squaredNorm()과 같이 전화하는 것이 더 간단합니다.

+0

Eigen에 대해 MKL 지원을 활성화하면 변경됩니까? MKL gemm()은 게으른 평가를 방해합니다. – kangshiyin

+2

아니요 여기 gemm-like 루틴 (Eigen의 built-in 또는 무엇이든 blas 백엔드)을 호출하기 전에 바로 가기가 적용 되었기 때문에 – ggael

+0

lysy eval에 대한 설명과 colwise를 사용한 간단한 접근에 감사드립니다! 내가 필요한 것 –

4

원하는대로 할 수 있습니다. minCoeff() maxCoeff(), 합(), 자극(), 트레이스() * 놈() * squaredNorm (:

squaredNorms = A.colwise().squaredNorm(); 

https://eigen.tuxfamily.org/dox/group__QuickRefPage.html

아이겐 같은 여러 환원 방법을 제공한다) *, all() 및 any(). 모든 축소 작업은 행렬 방식, 행 방식 또는 행 방식으로 수행 할 수 있습니다.

관련 문제