быстрое матричное умножение в Matlab - PullRequest
3 голосов
/ 04 октября 2011

Мне нужно сделать матричное / векторное умножение в Matlab очень больших размеров: «A» - это матрица с 655360 на 5 вещественных чисел, которые не обязательно разрежены, а «B» - это 655360 на 1 вещественный вектор.Мой вопрос заключается в том, как эффективно вычислить: B '* A.

Я заметил небольшое улучшение во времени за счет вычисления A' * B, которое дает вектор-столбец.Но все же это довольно медленно (мне нужно выполнить эту операцию несколько раз в программе).

Немного поиска я нашел интересный набор инструментов Matlab MTIMESX Джеймса Турса, который янадеется улучшить производительность умножения матрицы.После нескольких испытаний у меня может быть только очень незначительный выигрыш по сравнению с умножением собственной матрицы Matlab.

Есть предложения о том, как мне переписать A '* B, чтобы операция была более эффективной?Спасибо.

Ответы [ 5 ]

10 голосов
/ 04 октября 2011

смысл существования Matlab - это матричные вычисления. Я был бы весьма удивлен, если бы вы могли значительно превзойти встроенное умножение матриц с помощью инструментов, созданных вручную. Прежде всего, вы должны убедиться, что ваше умножение действительно может быть выполнено значительно быстрее. Вы можете сделать это, реализовав аналогичное умножение в C ++ с Eigen.

3 голосов
/ 04 октября 2011

У меня были хорошие результаты с умножением матрицы Matlab с использованием GPU

1 голос
/ 06 октября 2011

Matlab построен с использованием довольно оптимизированных библиотек (BLAS и т. Д.), Поэтому вы не можете легко улучшить его из Matlab. Что вы можете улучшить, так это получить более качественный BLAS, например оптимизированный для вашего процессора, - это позволит лучше использовать кэши, получая блоки данных соответствующего размера из основной памяти. Ознакомьтесь с созданием собственных скомпилированных версий ATLAS, ACML, MKL и Goto BLAS.

Я бы не пытался решить это одно конкретное умножение, если оно действительно не убивает вас. Изменение BLAS может привести к более удачному решению, особенно если вы в настоящее время не используете многоядерные процессоры.

1 голос
/ 04 октября 2011

Чтобы избежать операции транспонирования, вы можете попробовать:

sum(bsxfun(@times, A, B), 2)

Но я был бы удивлен, что это было быстрее, чем прямая версия. Смотрите ответ @ thiton.

Также посмотрите на http://www.mathworks.co.uk/company/newsletters/news_notes/june07/patterns.html, чтобы понять, почему версия на основе вектора столбцов быстрее, чем версия на основе строки.

0 голосов
/ 04 октября 2011

Ваш вариант № 1, если это ваше узкое место, это пересмотреть ваш алгоритм. См. Этот вопрос Оптимизация кода MATLAB , чтобы увидеть отличный пример того, как выбор другого алгоритма сократил время выполнения на три порядка.

...