Asked by Piment
on 30 Mar 2013

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.

*No products are associated with this question.*

Answer by Walter Roberson
on 30 Mar 2013

Edited by Walter Roberson
on 30 Mar 2013

Accepted answer

Use sub2ind()

Cedric Wannaz
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
on 30 Mar 2013

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

Cedric Wannaz
on 30 Mar 2013

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

Answer by Anand
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
on 30 Mar 2013

*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).

Answer by Piment
on 30 Mar 2013

Edited by Piment
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
on 30 Mar 2013

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

Opportunities for recent engineering grads.

## 1 Comment

## Ahmed A. Selman (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/69204#comment_139981

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