2011-11-18 2 views
1

두 개의 5000 x 1000 행렬 A와 B가 있다고 가정하십시오. 옥타브는 trace(A*B')을 효율적으로 계산합니다. 즉, 대부분이 사용되지 않는 5000 * 5000 내부 제품과 비교하여 5000 개의 내부 제품 만 필요합니다.옥타브 : trace() 사용의 효율성?

그리고 trace에 대한 인수가 더 복잡하다면, 즉 : trace(A*B' + C*D')? 그게 아무것도 바뀌 었습니까?

답변

2

trace(A*B')trace()을 사용하기 전에 전체 매트릭스 제품을 계산합니다.

보다 효율적인 방법은 sum(sum(A.*conj(B),2))입니다. 내부 합계는 결과 행렬의 diagonal을 계산합니다.

아마 더 효율적인 접근법은`sum ((A. * conj (B)) (:))를 통해 한 단계에서 두 합계를 수행하는 것입니다.

trace(A*B' + C*D')sum((A.*conj(B) + C.*conj(D))(:))에 의해 효율적으로 계산됩니다.

1

아니요, 제품은 trace() 호출 전에 평가됩니다. 하나의 효율적인 구현은 그 행렬 곱셈의 대각 항만을 수동으로 계산 한 다음 두 번째 예제에 대해

두 개를 모두 단축 할 수 있으며 가독성을 잃을 수도 있습니다. Matlab 호환성은 다음과 같습니다. sum((diag(A) .* diag(B))(:));