Array manipulation ... a better way?

2 views (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)


Find more on Cell Arrays in Help Center and File Exchange


Community Treasure Hunt

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

Start Hunting!

Translated by