Matlab, эквивалентный из широковещательной передачи Numpy?

Я пытаюсь найти некоторый путь к substract размером 3 вектора из каждого столбца 3* (большое количество) матрица в Matlab. Конечно, я мог использовать цикл, но я пытаюсь найти некоторое более эффективное решение, немного как широковещательная передача numpy. О, и я не могу использовать repmat, потому что у меня просто нет достаточной памяти для использования его (поскольку он создает еще одни 3* (большое количество) матрица)...

Действительно ли это возможно?

20
задан ali_m 29 November 2015 в 18:00
поделиться

3 ответа

Циклы уже не так плохи в MATLAB благодаря оптимизациям компилятора, таким как just-in-time acceleration (JITA). и т.д. Чаще всего я замечал, что решение с циклами в текущих версиях MATLAB намного быстрее, чем сложные (хотя и крутые :D) однострочники.

bsxfun может подойти но по моему опыту, у него тоже есть проблемы с памятью, но меньше, чем у repmat.

Так что синтаксис будет таким:

AA = bsxfun(@minus,A,b), где b - вектор, а A - ваша большая матрица

Но я призываю вас ознакомиться с зацикленной версией, а затем принять решение! Скорее всего, из-за нехватки памяти у вас не будет выбора :)

18
ответ дан 30 November 2019 в 00:13
поделиться

Я не знаю, ускорит ли это код, но вычитание скаляра из вектора не вызывает проблем с памятью. Поскольку размер вашей матрицы настолько асимметричен, накладные расходы от цикла for на коротком измерении незначительны.

Так что, возможно

matout = matin;
for j = 1:size(matin, 1) %3 in this case
     matout(j,:) = matin(j,:) - vec_to_subtract(j);
end

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

4
ответ дан 30 November 2019 в 00:13
поделиться

На самом деле кажется, что http://www.frontiernet.net/~dmschwarz/genops.html (перегрузка оператора файлами mex) тоже помогает, даже хотя я еще не тестировал.

0
ответ дан 30 November 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: