"Yvette Hammond" wrote in message <isk6s3$r2a$1@newscl01ah.mathworks.com>...
> Hi,
>
> I have the folllowing type of loop several times in my code and three of the lines are slowing my code down massively:
>
> B=zeros(length(ID),1);
> r_i=zeros(1,1);
> for i=1:1:length(ID)
>
> r_i=find(mat1(:,1)==ID(i,1));
> if isempty(r_i)
> B(i,1)=0;
>
> else
>
> B(i,1) = r_i;
>
> if max(B)==0
> B1=0;
> else
> B1=B(B~=0);
> end
> end
> end
>
> The <mx1> matrix 'ID' contains a list of numbers that I want to search for in the <px2> matrix 'mat1'. I want B1 to be an ordered list of the rows in 'mat1' where each number in 'ID' occurs (if it occurs at all). All numbers in 'mat1(:,1)' are unique and occur only once, the numbers in 'ID' may repeat. 'mat1' may not contain every number in 'ID'.
>
> The three lines that are taking the longest to compute are (in order of longest to shortest) 'B1=B(B~=0);', 'r_i=find(mat1(:,1)==ID(i,1));' and 'if max(B)==0'.
>
> Any ideas on how to speed up the above code would be very much appreciated, I have been struggling with this for a long time!
>
> Thanks in advance,
>
> Yvette
        
The fiveline ifelseend sequence involving B1 looks completely misplaced. It keeps overwriting all its previous computations in the forloop, so therefore it ought to be done after the forloop finishes where it would only be performed once.
However, there is a function, 'ismember', that can calculate B much more efficiently:
[t,B] = ismember(ID,mat1(:,1));
B1 = sort(B(t));
I have interpreted your phrase "I want B1 to be an ordered list" to mean you wanted the B1 indices of B to be in ascending order. That would not be accomplished in your code.
Roger Stafford
