MATLAB 행렬 곱셈 (최상의 계산 방식)


10

두 개의 참조 시스템 (축)간에 좌표 변환을 수행해야합니다. 이를 위해 일부 중간 축이 사용되기 때문에 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

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


4
쿼터니언을 사용하십시오 .
Chris Taylor

@ChrisTaylor : 제안 해 주셔서 감사합니다.
julianfperez

2
크로스 포스트하지 마십시오.
바가지

2
여기에 두 개의 질문이 있으며 여기에는 StackOverflow가 있습니다. 질문과 의견 및 답변이 하나로 통합되었습니다.
Aron Ahmadia

@ Will and AronAhmadia : 죄송합니다. 크로스 포스팅이 금지 된 것을 몰랐습니다. 나는 항상 StackOverflow에 질문을 게시했지만 오늘이 새로운 사이트를 찾았으며 여기에서도 도움을 얻을 수 있다고 생각했습니다.
julianfperez

답변:


17

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

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

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


답변에 제공된 흥미로운 정보에 감사드립니다.
julianfperez

중간체를 저장하면 왜 더 빠릅니까?
Federico Poloni

@FedericoPoloni : 중간체를 저장 하지 않는 것이 약간 더 빠르다고 썼습니다 .
Arnold Neumaier

@ArnoldNeumaier Ooh 죄송합니다. :)
Federico Poloni

14

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

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이 간단하고 효율적인 솔루션 의 알려진 문제 이기 때문에 행렬 곱셈 순서에 대해 똑똑하다고 생각했습니다 .


행렬이 3x3 인 부분을 놓치셨습니까? :)
Aron Ahmadia

2
@AronAhmadia : 죄송합니다. 고맙습니다. 나는 그 행렬 크기에 대해, 전체 문제가 무질서하다고 생각하지만, 여전히 큰 N에 대한 결과에 놀랐습니다.
Pedro

7
부동 소수점 수학이 연관성이 없으며 사용자가 수행하는 작업을 알고 있다고 가정하기 때문에 MATLAB이 표현식 평가에 대한 C 우선 순위 규칙을 따르는 것 같습니다.
Aron Ahmadia

2
@Pedro : 답변 주셔서 감사합니다. 행렬 차원 3x3의 경우 솔루션이 일반적인 (괄호없이) 행렬 곱셈보다 낫다는 것을 확인했습니다.
julianfperez

하나는 실행 시간을 측정하는 간단하고 쉬운 방법을 보여 주셔서 감사합니다
스티븐 Magana - 주크에게

14

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


답변 주셔서 감사합니다. 필자의 경우 행렬은 회전 행렬이므로 각도 값에 따라 달라지며 제품 A B C는 항상 동일하지는 않습니다.
julianfperez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.