MATLAB Answers

Damo Nair

Array manipulation ... a better way?

Asked by Damo Nair
on 23 Jan 2013


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

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



No products are associated with this question.

1 Answer

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);


I didn't see that you were indexing into another variable with your p values, but the idea should still hold.

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.


Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

MATLAB Academy

New to MATLAB?

Learn MATLAB today!