Как я могу ускорить это простое умножение матриц в Matlab? - PullRequest
2 голосов
/ 20 марта 2012

У меня нет большого опыта работы с Matlab, поэтому я задаю этот вопрос здесь, чтобы узнать, как начать искать.

У меня есть этот код:

A = A - A(:,i)*(A(i,:)/(delta + A(i,i)));

Матрица имеет размер 216x31285, что означает, что это вычисление достаточно дорого для количества выполнений.Он выполняется для всех строк (216) для каждого набора данных (28), поэтому, естественно, что 0,192 секунды это занимает совсем немного.Любые идеи о том, как я могу ускорить это?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Приложение к ответу @ Педро. Если у вас есть такое рекурсивное уравнение, вы обычно можете обменять пространство на время.

На первом шаге вы обновляете матрицу, скажем, B (после записи Педро):

B = A - f(i)

на втором шаге вы обновляете A:

A = B - f(i)

на третьем шаге, ну, это то же самое, что и первый шаг. И так далее.

1 голос
/ 26 марта 2012

Самый простой способ ускорить код в MATLAB - воспользоваться векторизацией, чтобы избавиться от циклов.Вместо того, чтобы зацикливать каждую строку или столбец, попытайтесь применить целые операции вместо этого, например, чтобы умножить все строки матрицы M с соответствующим вектором V do:

M = magic(5)
V = rand(5,1)
M = M.*repmat(V,[size(M,1) 1])

в целом будет работать намного быстреечем эквивалент для цикла.

Фактическая реализация векторизации специфична для каждой проблемы, но очень полезные операторы являются поэлементными операторами, например: .* ./ .^ и т. д. Также функция repmat чрезвычайно полезна.

В вашем случае, однако, вы применяете рекурсивную операцию к матрице A:

A = A - f(i) = A - (prevA - f(i-1)) = ...

, что означает, что вы не можете применить все итерации одновременно, как это обычно делается при векторизации кода.Другими словами, на каждой итерации i матрица A зависит от матрицы A на предыдущей итерации, и поэтому невозможно управлять всеми итерациями одновременно, используя предоставленное вами уравнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...