Asked by Damo Nair
on 23 Jan 2013

Hi,

I have a 2d array with 3 columns that look something like this ...

states 1 4 9 5 10 60 1 61 92 5 93 157 1 158 229 5 230 274

if the value in column 1 is 1 then I have to find the min value from a new array p, min(p(4:9)) & if its 5, the max, max(p(10:60)) for that value range listed in columns 2 & 3. The values in col. 1 take on values of either 1 or 5 only.

Now, I'm doing this in a loop in loop like ...

if states(i,1) == 1; q(i) = min(p(states(i,2):states(i,3))); if states(i,1) == 5; q(i) = max(p(states(i,2):states(i,3)));

Isn't there a better way to do this?

Thanks

Damo.

*No products are associated with this question.*

Answer by Sarah Wait Zaranek
on 25 Jan 2013

Accepted answer

You can do this with logical indexing (and not a for-loop)

q = zeros(length(p(:,1)),1);

Find where the first column is equal to 1.

idx1 = p(:,1) == 1;

Find the min of the next two columns where first column is equal to 1

q(idx1) = min(p(idx1,2:3),[],2);

Find where the first column is equal to 5

idx2 = p(:,1) == 5;

Find the min of the next two columns when first column is equal to 5

q(idx2) = max(p(idx2,2:3),[],2);

Sarah Wait Zaranek
on 25 Jan 2013

Opportunities for recent engineering grads.

## 1 Comment

## Walter Roberson (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/59612#comment_124413

Note: please only indent your code, and not your text description. I have edited for clarity.