Info
この質問は閉じられています。 編集または回答するには再度開いてください。
Optimize the FOR loop
2 ビュー (過去 30 日間)
古いコメントを表示
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]
回答 (2 件)
Sean de Wolski
2012 年 6 月 28 日
編集済み: Sean de Wolski
2012 年 6 月 28 日
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 件のコメント
Tom
2012 年 6 月 28 日
I just compared arrayfun and bsxfun, the latter is a whole order of magnitude faster.
Tom
2012 年 6 月 28 日
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 件のコメント
Tom
2012 年 6 月 28 日
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.
この質問は閉じられています。
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!