why arrayfun does NOT improve my struct array operation performance
3 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
here is the input data:
% @param Landmarks:
% Landmarks should be 1*m struct.
% m is the number of training set.
% Landmark(i).data is a n*2 matrix
old function:
function Landmarks=CenterOfGravity(Landmarks)
% align center of gravity
for i=1 : length(Landmarks)
Landmarks(i).data=Landmarks(i).data - ones(size(Landmarks(i).data,1),1)...
*mean(Landmarks(i).data);
end
end
new function which use arrayfun:
function [Landmarks] = center_to_gravity(Landmarks)
Landmarks = arrayfun(@(struct_data)...
struct('data', struct_data.data - repmat(mean(struct_data.data), [size(struct_data.data, 1), 1]))...
,Landmarks);
end %function center_to_gravity
when using profiler, I find the usage of time is NOT what I expected:
Function Total Time Self Time*
CenterOfGravity 0.011s 0.004 s
center_to_gravity 0.029s 0.001 s
Can someone tell me why?
0 commentaires
Réponse acceptée
Jan
le 23 Juin 2012
ARRAYFUN is not more efficient than a FOR loop, because it has a FOR loop internally.
Another idea:
for i = 1 : length(Landmarks)
data = Landmarks(i).data;
Landmarks(i).data= bsxfun(@minus, data, sum(data, 1) / size(data, 1));
end
Reduce the repeated access to a field, SUM/LENGTH is faster than MEAN, BSXFUN avoid the creation of a temporary array.
Or:
for i = 1 : length(Landmarks)
data = Landmarks(i).data;
m = sum(data, 1) / size(data, 1);
data(:, 1) = data(:, 1) - m(1);
data(:, 2) = data(:, 2) - m(2);
Landmarks(i).data = data;
end
3 commentaires
Plus de réponses (1)
Walter Roberson
le 23 Juin 2012
Also, profile disables a number of optimizations, so you cannot use profiler to determine full execution rate. Try timeit
Voir également
Catégories
En savoir plus sur Install Products dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!