MATLAB: Criss-cross indexing of array elements

arrayindexing

Hello, I'm not sure how to best describe my intention, so I'll use an example:
Say I have a 3D-array:
A(:,:,1) = [1 2 ; 3 4]
A(:,:,2) = [5 6 ; 7 8]
and a 2×2 matrix:
B = [1 2 ; 1 2]
I want MATLAB to give me a 2×2 matrix comprised of elements of A, where the 3rd-dimension position of the element that is picked is indexed by the matrix B. So, in this example:
C = A(:,:,B)
should return [1 6 ; 3 8], because it picks the elements of A(:,:,1) in the first column, and the elements of A(:,:,2) in the second column of the 2×2 matrix.
I could see this potentially being achieved with linear indexing, but is there a cleaner way?
Thanks!

Best Answer

Try this using linear indexing as you suggested:
z = size(A);
mn = z(1) * z(2);
x = (1:mn)' + (B(:)-1)*mn;
C = reshape(A(x),z(1),z(2));