## how to index a matrix by using a index matrix that has same size?

on 30 Mar 2013

### Walter Roberson (view profile)

I have a m by n data matrix and a m by n index matrix which rearranges the order of the n elements in each row of the data matrix. How can I get an indexed data matrix without using loop? Thanks.

Ahmed A. Selman

### Ahmed A. Selman (view profile)

on 30 Mar 2013

But matrices already are indexed arrays or vectors... right?

## Products

No products are associated with this question.

### Walter Roberson (view profile)

on 30 Mar 2013
Edited by Walter Roberson

on 30 Mar 2013

Use sub2ind()

Cedric Wannaz

### Cedric Wannaz (view profile)

on 30 Mar 2013

typo: sub2ind

To illustrate Walter's answer, if M is the matrix of data and I the matrix of column indices, you can do

``` rId = (1:size(M,1)).' * ones(1,size(M,2)) ;    % Matrix of row indices.
M_reordered = M(sub2ind(size(M), rId, I)) ;```
Walter Roberson

### Walter Roberson (view profile)

on 30 Mar 2013

Oops, yes, I was concentrating on not putting an "s" in and so left out the "2" :(

Cedric Wannaz

### Cedric Wannaz (view profile)

on 30 Mar 2013

I thought that you had forgotten the "s" and I ended up realizing that it was a "2" ;-)

### Anand (view profile)

on 30 Mar 2013

If A is your original matrix and idx is the matrix of indices, you can use logical indexing: A(idx).

Here's an example:

```>> A = rand(3)
```
```A =
```
```      0.8147    0.9134    0.2785
0.9058    0.6324    0.5469
0.1270    0.0975    0.9575```
```>> idx = [9 8 7;6 5 4;3 2 1]
```
```idx =
```
```       9     8     7
6     5     4
3     2     1```
```>> A(idx)
```
```ans =
```
```      0.9575    0.5469    0.2785
0.0975    0.6324    0.9134
0.1270    0.9058    0.8147```

Cedric Wannaz

### Cedric Wannaz (view profile)

on 30 Mar 2013

This is linear indexing actually; the idx matrix that you defined is essentially what we get after calling sub2ind() with a third arg that is a matrix of column indices for each row (different from linear index).

on 30 Mar 2013
Edited by Piment

### Piment (view profile)

on 30 Mar 2013

to be more specific, it's something like(it's actually 300 by 5500 in my case):

A =

```    0.9649    0.4854    0.9157
0.1576    0.8003    0.7922
0.9706    0.1419    0.9595
0.9572    0.4218    0.6557```

idx =

```     1     3     2
3     1     2
2     1     3
3     2     1```

Cedric Wannaz

### Cedric Wannaz (view profile)

on 30 Mar 2013

Walter's answer and my illustration should work; just replace M with A and I with idx.

Piment

### Piment (view profile)

on 30 Mar 2013

thank you both, it really does work.

#### Join the 15-year community celebration.

Play games and win prizes!

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