How to vectorize vector indexing?

6 visualizaciones (últimos 30 días)
Ken
Ken el 16 de Abr. de 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?

Respuesta aceptada

Matt Fig
Matt Fig el 16 de Abr. de 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 comentarios
Ken
Ken el 16 de Abr. de 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 el 16 de Abr. de 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)...

Iniciar sesión para comentar.

Más respuestas (1)

Paulo Silva
Paulo Silva el 16 de Abr. de 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)'

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by