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

New to MATLAB?

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

Asked by Piment

Piment

on 30 Mar 2013
Accepted Answer by Walter Roberson

Walter Roberson

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.

1 Comment

Ahmed A. Selman

Ahmed A. Selman

on 30 Mar 2013

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

Piment

Piment

Tags

Products

No products are associated with this question.

3 Answers

Answer by Walter Roberson

Walter Roberson

on 30 Mar 2013
Edited by Walter Roberson

Walter Roberson

on 30 Mar 2013
Accepted answer

Use sub2ind()

3 Comments

Cedric Wannaz

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

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

Cedric Wannaz

on 30 Mar 2013

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

Walter Roberson

Walter Roberson

Answer by Anand

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

1 Comment

Cedric Wannaz

Cedric Wannaz

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

Anand

Anand

Answer by Piment

Piment

on 30 Mar 2013
Edited by Piment

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

2 Comments

Cedric Wannaz

Cedric Wannaz

on 30 Mar 2013

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

Piment

Piment

on 30 Mar 2013

thank you both, it really does work.

Piment

Piment

Contact us