2014-12-04 3 views

ответ

3

В соответствии с этим, для этой цели существует семейство функций *fun (например, cellfun). Это другие вопросы по use и performance этих функций.

Однако, если вы строите f как функцию, которая строит массив ячеек как

f = @(x) {sin(x), cos(x), x+4}; 

, то вы можете вызвать функцию более естественно: f([1,2,3]), например. Этот метод также позволяет избежать необходимости в параде опций (, false), необходимых для cellfun для нескалярного аргумента.

Вы также можете использовать обычные двойные массивы, но тогда вам нужно быть осторожными с формой ввода для конкатенации: @(x) [sin(x), cos(x), x+4] против @(x) [sin(x); cos(x); x+4].

+0

Nice =) +1! Я дал некоторые результаты бенчмаркинга, которые показывают, что ваш подход действительно быстрый (и что петли не так уж медленны)! знак равно –

0

Это может сделать трюк

functions = {@(arg) sin(arg),@(arg) sqrt(arg)} 
x = 5; 
cellfun(@(arg) arg(x),functions) 

надеюсь, что это помогает.

Adrien.

+0

Это работает, но это примерно в 4 раза медленнее, чем обычные циклы. –

3

Я просто разместить эти бенчмаркинг результаты здесь, только чтобы показать, что петли не обязательно медленнее, чем другие подходы:

f = {@sin, @cos, @(x)x+4}; 
x = 1:100; 
tic 
for ii = 1:1000 
    for jj = 1:numel(f) 
     res{jj} = f{jj}(x); 
    end 
end 
toc 

tic 
for ii = 1:1000 
    res = cellfun(@(arg) arg(x),functions,'uni',0); 
end 
toc 

Elapsed time is 0.042201 seconds. 
Elapsed time is 0.179229 seconds. 

ответ Троя почти в два раза быстрее по мере приближения цикла:

tic 
for ii = 1:1000 
    res = f((1:100).'); 
end 
toc 
Elapsed time is 0.025378 seconds. 
Смежные вопросы