Множення матриці MATLAB (найкращий обчислювальний підхід)


10

Я маю зробити перетворення координат між двома опорними системами (осями). Для цього потрібно помножити три матриці ( ) через деякі проміжні осі. Я подумав про два підходи для вирішення цього питання:3×3

Спосіб №1 : Створення множення безпосередньо, тобто

vf=R1 R2 R3 vi

Спосіб №2 : Розбийте на кроки:

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

де:

R1 , і R_3 є 3 \ times3 матриціR 3 3 × 3R2R33×3

vf , vi , v3i , v23 - 3×1 вектори 3 \ times1

Мені хотілося б знати, який метод є більш ефективним обчислювально (менше часу) для здійснення перетворення (це буде зроблено багато разів).


4
Використовуйте кватерніони .
Кріс Тейлор

@ChrisTaylor: Дякую тобі за пропозицію.
julianfperez

2
Будь ласка, не перехрещуйтесь.
Зірвано

2
Зауважте, тут було перекладено два запитання та StackOverflow. Питання та їх коментарі та відповіді були об'єднані в це.
Арон Ахмадія

@Will and AronAhmadia: Мені шкода. Я не знав, що перехресне постіння заборонено. Я завжди розміщував свої запитання на StackOverflow, але сьогодні я знайшов цей новий сайт, і я подумав, що, можливо, я також можу знайти тут допомогу.
julianfperez

Відповіді:


17

Матлаб інтерпретує послідовності множення та / або ділення зліва направо. Отже, набагато дорожче, ніж , оскільки у вас замість трьох матричних векторних продуктів ви маєте два матричні продукти та один добуток матриці.A ( B ( C v ) )ABCvA(B(Cv))

З іншого боку, повинен бути трохи швидшим, ніж якщо ви зберігаєте проміжні продукти в окремих векторах, як підказує ваш другий метод.A(B(Cv))

Щоб дізнатися взагалі, як виміряти вплив невеликих різниць програмування на великомасштабні обчислення, напишіть у запиті Matlab '' профіль довідки ''.


Дякую за цікаву інформацію, надану у вашій відповіді.
julianfperez

Чому це швидше, якщо ви зберігаєте проміжні продукти?
Федеріко Полоні

@FedericoPoloni: Я писав, що трохи швидше не зберігати проміжні продукти.
Арнольд Ноймаєр

@ArnoldNeumaier О, вибачте, що я неправильно прочитав. :)
Федеріко Полоні

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 буде розумним щодо порядку множення матриці, оскільки це відома проблема простих та ефективних рішень.


Ви пропустили ту частину, де матриці 3х3? :)
Арон Ахмадія

2
@AronAhmadia: На жаль ... пропустив це, дякую. Я думаю, що для цих розмірів матриці вся проблема суперечить, але я все ще здивований результатами для великої Н.
Педро

7
Я здогадуюсь, що MATLAB дотримується правил C пріоритету для оцінки виразів, оскільки математика з плаваючою комою не асоціативна, і вони повинні вважати, що ти знаєш, що ти робиш :)
Арон Ахмадія

2
@Pedro: Дякую за вашу відповідь. Для розмірності матриці 3x3 я перевірив, що ваше рішення також краще, ніж звичайне (без дужок) множення матриці.
julianfperez

+1 дякую, що показали простий і простий спосіб виміряти час роботи
Стівен Магана-Зоок

14

Оскільки матриць настільки малий, усі витрати будуть накладені накладні витрати. Якщо ви будете робити перетворення багато разів, буде швидше попередньо обчислити D=A*B*Cодин раз, а потім застосувати кожен вектор v_f=D*v_i. Ви також можете розглянути можливість виведення цього файлу в мексичний файл.


Спасибі за вашу відповідь. У моєму випадку матриці є обертовими (вони залежать від кутового значення, і це змінюється), тому добуток A B C не завжди однаковий.
julianfperez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.