How to vectorize the find function?

조회 수: 1 (최근 30일)
Bernard Küsel
Bernard Küsel 2011년 5월 13일
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?

채택된 답변

Sean de Wolski
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.
  댓글 수: 6
Sean de Wolski
Sean de Wolski 2011년 5월 13일
^^^^Jealous.
Bernard Küsel
Bernard Küsel 2011년 5월 16일
Thanks for the help!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Doug Hull
Doug Hull 2011년 5월 13일
Why vectorize?
Just add another for loop for the rows.
  댓글 수: 4
Doug Hull
Doug Hull 2011년 5월 13일
Your question is then about speeding up the code, not about vectorizing?
Bernard Küsel
Bernard Küsel 2011년 5월 16일
Yeah, sorry about that.. It's just that vectorizing usually speeds up the code.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by