How to vectorize the find function?
4 次查看(过去 30 天)
显示 更早的评论
This is my code:
for i=1:size(Z,3)
indmax(i)=find(abs(Z(1,:,i))>z90(1,1,i),1);
indmin(i)=find(abs(Z(1,:,i))>z10(1,1,i),1);
end
trise(:,1)=(t(indmax)-t(indmin));
The variable Z is normally 3 or 6 rows, many columns and 5-10 pages. Something like:
size(Z)= 6 1920 8
The variables z10 and z90 have the same number of rows and pages as Z and 1 column. Something like:
size(z10)=size(z90)=6 1 8
I would actually need to repeat this code 6 more times (1 for each row).
Is there a way to vectorize this?
0 个评论
采纳的回答
Sean de Wolski
2011-5-13
%small sample because you only looped over first row
Z = rand(1,5,8)*2.5;
z90 = rand(1,1,8);
z10 = rand(1,1,8);
%Your way
for i=1:size(Z,3)
indmax(i)=find(abs(Z(1,:,i))>z90(1,1,i),1);
indmin(i)=find(abs(Z(1,:,i))>z10(1,1,i),1);
end
%Vectozed way:
[jk, indmx] = max(bsxfun(@gt,abs(Z),z90),[],2);
[jk, indmn] = max(bsxfun(@gt,abs(Z),z10),[],2);
indmx = squeeze(indmx);
indmn = squeeze(indmin);
isequal(indmin,indmn)
isequal(indmax,indmx.') %transpose rowvec
This method is extended to the full size, though just looping over the six rows is probably just as easy/fast. I.e. loop 1:6, extract trise on each iteration.
更多回答(1 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!