Array manipulation ... a better way?

3 visualizzazioni (ultimi 30 giorni)
Damo Nair
Damo Nair il 23 Gen 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.
  1 Commento
Walter Roberson
Walter Roberson il 23 Gen 2013
Note: please only indent your code, and not your text description. I have edited for clarity.

Accedi per commentare.

Risposta accettata

Sarah Wait Zaranek
Sarah Wait Zaranek il 25 Gen 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);
  2 Commenti
Sarah Wait Zaranek
Sarah Wait Zaranek il 25 Gen 2013
I didn't see that you were indexing into another variable with your p values, but the idea should still hold.
Damo Nair
Damo Nair il 26 Gen 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.
Damo.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by