Selecting Elements of a Matrix by Indexing with a Vector

3 views (last 30 days)
I have a 100x3 matrix and I'd like to select one element from each row to form a 100x1 vector. Given a vector of 100 indeces between 1-3, how can I obtain this? The code below is what I thought should work, but instead produces a 100x100 matrix (concatenation of each 100x1 vector generated by each value of indx).
A = rand(100,3);
indx = randi([1 3],100,1); % for each row, which column do I want to pull the element from?
B = A(:,indx); % B is 100x100, I want 100x1

Accepted Answer

Ameer Hamza
Ameer Hamza on 23 Apr 2020
Edited: Ameer Hamza on 23 Apr 2020
See sub2ind() function.
A = rand(100,3);
indx = randi([1 3],100,1);
idx = sub2ind(size(A), (1:size(A,1)).', indx);
B = A(idx);
  2 Comments
Darren Wethington
Darren Wethington on 23 Apr 2020
This worked, I was just hoping to not have to sub2ind it and was curious if there was a more straightforward way. I'll use this, thanks.
Ameer Hamza
Ameer Hamza on 23 Apr 2020
I think sub2ind is the simplest way to do such a thing. Following avoids sub2ind, but I am not sure you can call it straightforward
A = rand(100,3);
indx = randi([1 3],100,1);
ind = (1:size(A,1)).' + (indx-1).*size(A,1);
B = A(ind);

Sign in to comment.

More Answers (1)

David Hill
David Hill on 23 Apr 2020
A = rand(100,3);
indx = randi([1 3],100,1);
B = A(1:100,indx);

Tags

Community Treasure Hunt

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

Start Hunting!