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).



@ 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 ''.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.