MATLAB 행렬 곱셈 (최상의 계산 방식) 접근법에 대해 생각했다.3×33×33\times3 방법

두 개의 참조 시스템 (축)간에 좌표 변환을 수행해야합니다. 이를 위해 일부 중간 축이 사용되기 때문에 3 개의 행렬 ( )을 곱해야합니다. 나는 이것을 해결하기 위해 두 가지 접근법에 대해 생각했다.

3×3

방법 # 1 : 곱셈을 직접 만들기, 즉

vf=R1 R2 R3 vi

방법 # 2 : 단계로 나누기 :


  1. v3i=R3 vi


  2. v23=R2 v3나는


  3. V에프=아르 자형1 V23

어디:

, R 2 R 3 3 × 3 행렬입니다

아르 자형1

아르 자형2

아르 자형

×

, v i , v 3 i , v 23 3 × 1 벡터입니다

V에프

V나는

V나는

V23

×1

변환을 수행하는 데 더 효율적인 계산 방법 (시간이 더 적은)이 무엇인지 알고 싶습니다 (많은 시간이 걸릴 것입니다).



답변

Matlab은 왼쪽에서 오른쪽으로 곱셈 및 / 또는 나누기 시퀀스를 해석합니다. 따라서 는 3 개의 행렬-벡터 곱 대신 2 개의 행렬 곱과 1 개의 행렬-벨코 곱을 가지기 때문에 A * ( B * ( C * v ) ) 보다 훨씬 비쌉니다 .

V

((V))

반면에 는 두 번째 방법에서 알 수 있듯이 중간체를 별도의 벡터에 저장하는 것보다 약간 더 빠릅니다.

((V))

대규모 계산에서 작은 프로그래밍 차이가 미치는 영향을 측정하는 방법을 일반적으로 찾으려면 Matlab 프롬프트“도움말 프로필 ”을 작성하십시오.


답변

우선, 중간 변수를 사용하지 않고 대괄호를 사용합니다. 물론 중간 결과에 관심이 없다면 추측하지 않습니다.

Matlab에서 다음을 시도했습니다.

>> N = 500;
>> A = rand(N); B = rand(N); C = rand(N); v = rand(N,1);

>> tic, for k=1:100, A*B*C*v; end; toc
Elapsed time is 3.207299 seconds.

>> tic, for k=1:100, A*(B*(C*v)); end; toc
Elapsed time is 0.108095 seconds.

그러나 나는 이것이 매우 무서운 것이라고 말해야한다. 저는 Matlab이 간단하고 효율적인 솔루션 의 알려진 문제 이기 때문에 행렬 곱셈 순서에 대해 똑똑하다고 생각했습니다 .


답변

행렬이 매우 작기 때문에 모든 비용이 호출 오버 헤드가됩니다. 변환을 여러 번 수행하는 경우 D=A*B*C한 번 사전 계산 한 다음 각 벡터에 적용하는 것이 더 빠릅니다 v_f=D*v_i. 이것을 mex 파일로 가져 오는 것도 고려할 수 있습니다.


답변