Quickest way to get points in a matrix given two 1-D arrays?

1 view (last 30 days)
James on 27 Feb 2012
Let's say that A is an NxN matrix, and B and C are 1-D arrays of the same size, containing numbers between 1 and N.
Is there a better way than going through a "for loopvar=1:length(B)" loop to get the values of A that correspond to the (Bi, Ci)
Example: A is a 5x5 matrix B contains [1 3 5 2 4 5] C contains [2 1 4 3 5 2]
What would be the quickest way to get:
• A(1,2) (Corrseponding to A(B(1), C(1)))
• A(3,1) (Corrseponding to A(B(2), C(2)))
• A(5,4)
• A(2,3)
• A(4,5)
• A(5,2) (Corrseponding to A(B(6), C(6)))
I'd like the quickest way to get this, since I need to run this calculation an enormous number of times with matrices much larger than a 5x5.

Honglei Chen on 27 Feb 2012
A(sub2ind(size(A),B(:),C(:)))
James on 28 Feb 2012
Exactly what I was looking for. Thanks!

Sean de Wolski on 27 Feb 2012
Apart = diag(A(B(:),C(:)))
James on 28 Feb 2012
I like this for smaller sets, but I'm running a Monte carlo simulation with several thousand data points. The other answer is quicker for the larger data sets I'm using. Still, this is a good trick for smaller sets. It never hurts to have multiple ways of solving things.