2013-04-22 2 views
9

Какой из них лучше, используя все *fun функции (arrayfun, cellfun, structfun и spfun) или просто используя for цикл?Matlab: arrayfun, cellfun, spfun и structfun против простой для цикла

Какой метод дает лучшую производительность и какие методы следует считать лучшей практикой с точки зрения удобочитаемости кода?

+4

Связанный вопрос: [arrayfun может быть значительно медленнее, чем явный цикл в MATLAB. Почему?] (Http://stackoverflow.com/questions/12522888/arrayfun-can-be-significantly-slower-than-an-explicit-loop-in-matlab-why) –

+2

также связан [ответ] (http:// /stackoverflow.com/a/15181321/1714410) – Shai

+0

Я бы сказал, что это сильно зависит от того, какой релиз MATLAB вы угадываете. В моем случае, MATLAB R2012a, я использую почти только циклы for for – fpe

ответ

16

Это действительно зависит от того, что вы называете «производительность» :)

Если вы имеете в виду минимальное время выполнения, ну, иногда *fun быстрее (например, cellfun('isempty', ...); (да, строковый аргумент!) Наверняка биений версия цикла). Иногда цикл работает быстрее. Если вы используете версию Matlab < 2006, по умолчанию выполняйте функции *fun. Если вы находитесь в чем-то более недавнем, пойдите для циклов по умолчанию. Вам все равно придется профилировать, чтобы узнать, какой из них быстрее.

Как отметил Amro, если у вас есть графический процессор, способный делать FP арифметику, и последнюю версию Matlab, которая поддерживает GPGPU, то вызов arrayfun для gpuArray входов будут массово-распараллеливание. Однако никакие общие утверждения не могут быть сделаны в отношении времени выполнения; для небольших массивов или абсолютно сложных, накладные расходы на копирование всего на GPU могут отменить любую выгоду от распараллеливания вычислений, поэтому ... профилирование - это действительно единственный способ узнать наверняка.

Если вы имеете в виду минимальное кодирование времени, то я бы сказал, что это обычно быстрее кода с точки зрения *fun, пока операции просты. Для чего-либо сложного, как правило, лучше пойти на цикл.

Если вы имеете в виду оптимальной читаемости и, таким образом минимальное время, необходимое для технического обслуживания и внедрения изменений в профессиональном контексте, наверняка, идти на петлю.

На данный момент, есть не очень отчетливый простой ответ на ваш вопрос :)

Смежные вопросы