Предположим, у вас есть цикл с 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
Это все еще примерно в два раза медленнее, чем первый цикл, и я не понимаю почему. Два последних цикла почти одинаковы по скорости.
Я что-то здесь делаю не так? Как я могу достичь той же производительности, что и первый цикл с помощью этой дополнительной функции?
Помощь очень ценится!