Array manipulation ... a better way?

1 view (last 30 days)
I have a 2d array with 3 columns that look something like this ...
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?
  1 Comment
Walter Roberson
Walter Roberson on 23 Jan 2013
Note: please only indent your code, and not your text description. I have edited for clarity.

Sign in to comment.

Accepted Answer

Sarah Wait Zaranek
Sarah Wait Zaranek on 25 Jan 2013
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);
Damo Nair
Damo Nair on 26 Jan 2013
Thanks, Sarah.
Your method does indeed work! I can reference the 2nd array with those indices. Don't know why these things elude me sometimes :)
Have a good day.

Sign in to comment.

More Answers (0)


Community Treasure Hunt

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

Start Hunting!