Является ли операция arrayfun в Matlab более эффективной с точки зрения памяти, чем предварительно выделенная для l oop? - PullRequest
0 голосов
/ 19 июня 2020

Например, для

raw = ones(1000, 1);
x = cell(1000, 1);
for i=1:size(raw, 1)
    x(i) = some_process(raw(i));
end

требуется больше памяти, чем

raw = ones(1000, 1);
x = arrayfun(@(r) some_process(r), raw, 'UniformOutput', False);

Насколько я понимаю, предварительно выделенный для-l oop потребует инициализации как raw, так и x перед началом процесса, что требует больше памяти в целом. Это правильно?

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 19 июня 2020

Нет, это не более эффективно, а в некоторых случаях может даже хуже. arrayfun - это просто синтаксис c сахар для for l oop. JIT Matlab может оптимизировать модификации предварительно выделенных массивов "на месте". Я не встречал случаев, когда arrayfun(), используемый с дескриптором функции, работает лучше, чем for l oop и предварительно выделенные массивы в последних версиях Matlab-i sh.

В вашем конкретном случае , они, вероятно, будут работать примерно так же. Так что используйте тот стиль, который вам больше нравится.

Обратите внимание, что, строго говоря, arrayfun не выполняет , а операции "векторизованные". «векторизованный» относится к некоторому встроенному средству Matlab, которое может работать со всем массивом внутри движка Matlab, используя. arrayfun не может волшебным образом сделать это.

Исключение: если вы используете Matlab Parallel Computing Toolbox или работаете с массивами tall, тогда arrayfun действительно может распараллеливать операции в нескольких массивах элементов, и может go быстрее, чем a для l oop.

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