Multiplicação de matrizes MATLAB (a melhor abordagem computacional)

10

Eu tenho que fazer uma transformação de coordenadas entre dois sistemas de referência (eixos). Para isso, três matrizes ( ) devem ser multiplicadas devido ao uso de alguns eixos intermediários. Pensei em duas abordagens para resolver isso:3×3

Método # 1 : Fazendo a multiplicação diretamente, ou seja,

vf=R1 R2 R3 vi

Método # 2 : Divida em etapas:

  1. v3i=R3 vi
  2. v23=R2 v3i
  3. vf=R1 v23

Onde:

R1 , e são matrizesR 3 3 × 3R2R33×3

v i v 3 i v 23 3 × 1vf , , , são vetoresviv3iv233×1

Gostaria de saber qual método é mais eficiente computacionalmente (menos tempo) para fazer a transformação (isso será feito várias vezes).

julianfperez
fonte
4
Use quaternions .
Chris Taylor
@ ChrisTaylor: Muito obrigado pela sua sugestão.
Julianfperez
2
Por favor, não cruze.
Arrancado
2
Observe que havia duas perguntas postadas aqui e no StackOverflow. As perguntas, seus comentários e respostas foram mesclados a este.
Aron Ahmadia
@ Will e AronAhmadia: me desculpe. Eu não sabia que o cruzamento é proibido. Sempre publiquei minhas perguntas no StackOverflow, mas hoje encontrei este novo site e pensei que talvez também pudesse encontrar ajuda aqui.
Julianfperez

Respostas:

17

ABCvA(B(Cv))

A(B(Cv))

Para descobrir em geral como medir o impacto de pequenas diferenças de programação em cálculos em larga escala, escreva no prompt do Matlab '' perfil de ajuda ''.

Arnold Neumaier
fonte
Obrigado pelas informações interessantes fornecidas em sua resposta.
Julianfperez
Por que é mais rápido se você salvar os intermediários?
Federico Poloni
@FedericoPoloni: Eu escrevi que é um pouco mais rápido não salvar os intermediários.
Arnold Neumaier
@ArnoldNeumaier Ooh, desculpe, eu li errado. :)
Federico Poloni
14

Para iniciantes, eu não usaria variáveis ​​intermediárias, mas colchetes. A menos, é claro, que você esteja interessado nos resultados intermediários, mas acho que não.

Eu tentei o seguinte no 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.

Devo dizer, porém, que isso é bastante assustador. Eu sempre assumi que o Matlab seria inteligente em relação à ordem de multiplicação da matriz, pois esse é um problema conhecido com soluções simples e eficientes.

Pedro
fonte
Você perdeu a parte em que as matrizes são 3x3? :)
Aron Ahmadia
2
@AronAhmadia: Opa ... Perdi isso, obrigado. Eu acho que para esses tamanhos de matriz, o problema todo é discutível, mas eu ainda estou surpreso com os resultados para grande N.
Pedro
7
Eu estou supondo MATLAB está seguindo as regras C precedência para avaliação da expressão porque a matemática de ponto flutuante não é associativa e eles têm que assumir que você sabe o que está fazendo :)
Aron Ahmadia
2
@ Pedro: Obrigado pela sua resposta. Para a dimensão 3x3 da matriz, verifiquei que sua solução também é melhor que a multiplicação usual (sem colchetes) da matriz.
Julianfperez
+1 obrigado por mostrar uma maneira simples e fácil de medir o tempo de execução
Steven Magana-Zook 21/12
14

Como as matrizes são muito pequenas, todo o custo será pago em excesso. Se você realizar a transformação várias vezes, será mais rápido pré-calcular D=A*B*Cuma vez e depois aplicar cada vetor v_f=D*v_i. Você também pode considerar trazer isso para um arquivo mex.

Aron Ahmadia
fonte
Obrigado pela sua resposta. No meu caso, as matrizes são de rotação (elas dependem de um valor angular e isso muda), portanto o produto A B C nem sempre é o mesmo.
Julianfperez