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

# Array manipulation ... a better way?

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.

## 1 Comment

Walter Roberson on 23 Jan 2013

## Products

No products are associated with this question.

Answer by 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);
```

Sarah Wait Zaranek on 25 Jan 2013

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

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.

Damo.