Медленная анонимная функция

Предположим, у вас есть цикл с 50000 итерациями, и вы хотите вычислить средние значения (скаляры) из множества матриц. Это не все, но примерно так:

for k=1:50000
...
mean=sum(sum(matrix))/numel(matrix); %Arithmetic mean
...
end

А теперь хочу включить различные уравнения среднего на выбор. Сначала я попробовал следующее:

average='arithmetic'
for k=1:50000
...
switch average
    case 'arithmetic'
        mean=sum(sum(matrix))/numel(matrix); %Arithmetic mean
    case 'geometric'
        mean=prod(prod(matrix)).^(1/numel(matrix)); %Geometric mean
    case 'harmonic'
        mean=numel(matrix)/sum(sum(1./matrix)); %Harmonic mean
end
...
end

Это явно намного медленнее, чем первый цикл, потому что ему нужно найти соответствующую строку для каждой итерации, что кажется действительно ненужным. Затем я попробовал следующее:

average='arithmetic'
switch average
    case 'arithmetic'
        eq=@(arg)sum(sum(arg))/numel(arg); %Arithmetic mean
    case 'geometric'
        eq=@(arg)prod(prod(arg)).^(1/numel(arg)); %Geometric mean
    case 'harmonic'
        eq=@(arg)numel(arg)/sum(sum(1./arg)); %Harmonic mean
end

for k=1:50000
...
mean=eq(matrix); %Call mean equation
...
end

Это все еще примерно в два раза медленнее, чем первый цикл, и я не понимаю почему. Два последних цикла почти одинаковы по скорости.

Я что-то здесь делаю не так? Как я могу достичь той же производительности, что и первый цикл с помощью этой дополнительной функции?

Помощь очень ценится!

6
задан gnovice 17 May 2017 в 06:17
поделиться