Эквивалент Matlab вещания Numpy?

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

Возможно ли это?

Ответы

Ответ 1

Петли в MATLAB неплохое, благодаря оптимизации компилятора, например ускорение точно в момент времени (JITA). и т.д. В большинстве случаев я заметил, что решение с циклами в текущих версиях MATLAB намного быстрее, чем сложные (хотя и холодные: D) однострочные.

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

Таким образом, синтаксис будет выглядеть следующим образом:

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

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

Ответ 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 файлов) тоже делает трюк, хотя я не тестировал он еще.