Matlab эквивалент вещания Numpy? - PullRequest
20 голосов
/ 09 июля 2010

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

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

Ответы [ 4 ]

18 голосов
/ 09 июля 2010

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

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

Таким образом, синтаксис будет:

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

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

13 голосов
/ 18 октября 2016

Остальные ответы немного устарели - в Matlab R2016b добавлено добавленное вещание в качестве стандартной функции .Пример из этого поста в блоге, который соответствует вопросу:

>> A = ones(2) + [1 5]'
A =
     2     2
     6     6
4 голосов
/ 12 июля 2010

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

Так может быть

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

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

0 голосов
/ 19 июля 2010

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

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