Info
Cette question est clôturée. Rouvrir pour modifier ou répondre.
Optimize the FOR loop
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I am learning to optimize the following nested FOR loop, any comments are appreciated,
x=[537 558 583 606 631 655 666 700 722 799 823 847];
y=[48 216 384 552 720 888 1056];
z = zeros(1,numel(x));
for j = 1:numel(x)
for i = 1:numel(y)
if(x(j) <= y(i) )
z(j) = i;
break;
end
end
end
%ans
%z = [4 5 5 5 5 5 5 5 6 6 6 6]
Réponses (2)
Sean de Wolski
le 28 Juin 2012
Modifié(e) : Sean de Wolski
le 28 Juin 2012
If you can guarantee that the is at least one occurence of x(:) <y (:) then this will work:
x=[537 558 583 606 631 655 666 700 722 799 823 847];
y=[48 216 384 552 720 888 1056];
[~,z] = max(bsxfun(@le,x,y'),[],1)
4 commentaires
Tom
le 28 Juin 2012
I just compared arrayfun and bsxfun, the latter is a whole order of magnitude faster.
Tom
le 28 Juin 2012
It seems what you're trying to is find the first instance of each value of x being less than each value of y. You can do this in using arrayfun:
arrayfun(@(n) find(n<y,1),x)
the first argument is an anonymous function. For each value in x, the find function is used to find the first instance of that x value being less than the y vector.
1 commentaire
Tom
le 28 Juin 2012
Seeing what Sean said, this way also only works if there is an occurrence of for all of them- if there isn't then 'UniformOutput' has to be set to false, which means the output will be a cell array.
Cette question est clôturée.
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!