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