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

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.

 采纳的回答

Use sub2ind()

3 个评论

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)) ;
Oops, yes, I was concentrating on not putting an "s" in and so left out the "2" :(
I thought that you had forgotten the "s" and I ended up realizing that it was a "2" ;-)

请先登录,再进行评论。

更多回答(2 个)

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 个评论

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

请先登录,再进行评论。

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 个评论

Walter's answer and my illustration should work; just replace M with A and I with idx.
thank you both, it really does work.

请先登录,再进行评论。

类别

帮助中心File Exchange 中查找有关 Matrix Indexing 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by