Я должен сделать преобразование координат между двумя системами отсчета (осями). Для этого необходимо умножить три матрицы ( ) из-за использования некоторых промежуточных осей. Я думал о двух подходах, чтобы решить эту проблему:
Способ № 1 : Выполнение умножения напрямую, то есть
Способ № 2 : разделить на этапы:
где:
, и - матрицы
, , , являются векторами
Я хотел бы знать, какой метод является более эффективным в вычислительном отношении (меньше времени), чтобы сделать преобразование (это будет сделано много раз).
matrix
performance
matlab
julianfperez
источник
источник
Ответы:
Matlab интерпретирует последовательности умножений и / или делений слева направо. Следовательно, намного дороже, чем , поскольку вместо трех продуктов матрицы-вектора у вас есть два матричных произведения и один матрично-векторный продукт.A ∗ ( B ∗ ( C ∗ v ) )A∗B∗C∗v A∗(B∗(C∗v))
С другой стороны, должно быть немного быстрее, чем если вы сохраните промежуточные продукты в отдельных векторах, как предполагает ваш второй метод.A∗(B∗(C∗v))
Чтобы узнать, как измерить влияние небольших различий в программировании на крупномасштабные вычисления, напишите в приглашении Matlab «Справочный профиль».
источник
Для начала я бы не использовал промежуточные переменные, а только скобки. Если, конечно, вы заинтересованы в промежуточных результатах, но я думаю, нет.
Я попробовал следующее в Matlab:
Я должен сказать, однако, что это довольно страшно. Я всегда предполагал, что Matlab будет умно относиться к порядку умножения матриц, поскольку это известная проблема с простыми и эффективными решениями.
источник
Поскольку матрицы настолько малы, все затраты будут связаны с накладными расходами. Если вы будете выполнять преобразование много раз, будет быстрее выполнить предварительный расчет
D=A*B*C
один раз, а затем для каждого вектора применитьv_f=D*v_i
. Вы также можете рассмотреть возможность переноса этого в мекс файл.источник