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

A∗B∗C∗vA∗(B∗(C∗v))

A∗(B∗(C∗v))

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.