MATLAB: улучшение цикла for - PullRequest
0 голосов
/ 11 июня 2018

Мне нужно умножить части вектора столбца на фиксированный вектор строки.Я решил эту проблему, используя цикл for.Однако мне интересно, можно ли улучшить производительность, поскольку мне приходится выполнять такие вычисления примерно в 50 миллионов раз.Вот мой код:

multMat = 1:5;
mat = randi(5,10,1);
windowSize = 5;

vout = nan(10,1);
for r = windowSize : 10
    vout(r) = multMat * mat( (r - windowSize + 1) : r);
end

Я думал об использовании arrayfun.Однако, во-первых, я не знаю, как определить диапазон ячеек (т. Е. Предыдущие пять ячеек, включая текущую), а во-вторых, я не уверен, будет ли arrayfun быстрее, чем при использовании цикла?

1 Ответ

0 голосов
/ 11 июня 2018

Это умножение скользящего вектора, которое вы описываете, является примером того, что известно как свертка .Следующее приводит к тому же результату, что и цикл в вашем примере:

vout = [nan(windowSize-1,1);
        conv(mat,flip(multMat),'valid')];

Если ваш вывод на самом деле не нуждается в ведущих значениях NaN, которые не перезаписываются в вашем цикле, тогда выражение convдостаточно, не конкатенируя к нему элементы NaN.

Для достаточно больших векторов это, конечно, не гарантирует, что это будет так быстро, как хотелось бы, но встроенная в свертку реализация MATLAB, скорее всего,быть достаточно близким к оптимальному инструменту для работы.

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