Matlab-эквивалент Numpy broadcasting?
-
13-09-2020 - |
Вопрос
Я пытаюсь найти какой-нибудь способ вычитать вектор размера 3 из каждого столбца матрицы 3 * (большое число) в Matlab.Конечно, я мог бы использовать цикл, но я пытаюсь найти какое-то более эффективное решение, немного похожее на numpy broadcasting.О, и я не могу использовать repmat, потому что у меня просто недостаточно памяти для его использования (поскольку он создает еще одну матрицу 3 * (большое число))...
Возможно ли это?
Решение
Циклы в MATLAB уже не так плохи благодаря оптимизации компилятора, такой как ускорение точно в срок (JITA).и т.д.В большинстве случаев я заметил, что решение с циклами в текущих версиях MATLAB является многое быстрее, чем сложные (хотя и крутые: D) однострочники.
bsxfun
возможно, это сработает но по моему опыту, у него также есть проблемы с памятью, но в меньшей степени, чем у repmat
.
Таким образом, синтаксис был бы следующим:
AA = bsxfun(@minus,A,b)
где b
является вектором и A
это ваша большая матрица
Но я настоятельно рекомендую вам составить профиль циклической версии, а затем принимать решение!Скорее всего, из-за ограничений памяти у вас может не быть выбора :)
Другие советы
Другие ответы немного устарели - matlab r2016b, кажется, имеет Добавлено вещание в качестве стандартной функции .Пример от этого поста блога, который соответствует вопросу:
>> A = ones(2) + [1 5]'
A =
2 2
6 6
. Я не знаю, будет ли это ускорить код, но вычитание скаляра от вектора не имеет проблем с памятью.Поскольку размер матричного размера настолько асимметричен, накладные рассылки из контура на коротком измерении незначителимо.
Так, может быть,
matout = matin;
for j = 1:size(matin, 1) %3 in this case
matout(j,:) = matin(j,:) - vec_to_subtract(j);
end
.
Конечно, вы могли бы сделать это на месте, но я не знал, хотел ли вы сохранить оригинальную матрицу.
На самом деле, кажется, что http://www.frontiernet.net/~dmschwarz/genops.html (перегрузка оператора с файлами MEX) делает трюк, даже если я еще не проверил его.