How to vectorize vector indexing?

9 次查看(过去 30 天)
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?

采纳的回答

Matt Fig
Matt Fig 2011-4-16
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 个评论
Ken
Ken 2011-4-16
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 2011-4-16
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)...

请先登录,再进行评论。

更多回答(1 个)

Paulo Silva
Paulo Silva 2011-4-16
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)'

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

标签

产品

Community Treasure Hunt

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

Start Hunting!

Translated by