How to vectorize vector indexing?

9 vues (au cours des 30 derniers jours)
Ken
Ken le 16 Avr 2011
I want to vectorize the operation of indexing an element in a vector. That is, given a vector of vector indices, I want to pick the corresponding elements out of a matrix where each row is the vector to index.
e.g.
For a matrix
[1 2 3 4;
5 6 7 8;
9 10 11 12]
and the vector of row indices
[2 3 1]
I want to return
[2;
7;
9]
Can this be done with a one-liner?

Réponse acceptée

Matt Fig
Matt Fig le 16 Avr 2011
Another approach:
% Data
A = [1 2 3 4;
5 6 7 8;
9 10 11 12];
c = [2 3 1];
%Extraction:
E = A((1:size(A,1))+(c-1)*size(A,1)).'
If size(A,1) is already known (say m=3), then the obvious simplification results...
E = A((1:m)+(c-1)*m).'
  2 commentaires
Ken
Ken le 16 Avr 2011
Thanks Matt and Paulo for your answers. Although the simplicity of the diag(a(:,c)) approach is the elegant solution I was looking for, it's far slower than Matt's linear indexing approach. It also exceeds MATLAB's maximum variable size much more easily because it creates a square matrix with dimension numel(c).
In a quick test indexing 50000 vectors, each 1000 elements long, the linear indexing approach was about 80 times faster than arrayfun. The diag method exceeded the maximum variable size.
Matt Fig
Matt Fig le 16 Avr 2011
Notice also that this:
ROW + (COL-1)*size(A,1)
is just an in-lining of SUB2IND for 2D matrices, something every chronic MATLABer should have memorized (IMO)...

Connectez-vous pour commenter.

Plus de réponses (1)

Paulo Silva
Paulo Silva le 16 Avr 2011
a=[1 2 3 4;
5 6 7 8;
9 10 11 12];
v=[2 3 1];
diag(a(1:end,v))
Another way
arrayfun(@(x,y)a(x,y),1:3,v)'

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by