How to use a 2D index to create a 3D array from a 4D array?
2 views (last 30 days)
Show older comments
Hello,
I have a main 4D array A with size
200x300x3x5
and I want to create a 3D array C of size
200x300x3
using a 2D array index that picks one specific set of the 4D array A to keep to make C.
I have a 2D index array B with size
200x300
, and all elements of B range from 1 to 5 (i.e. size of the 4th dimension of A). Each element in B indicates to which set of the 4th dimension element I want to access from A to use to create C.
I want to avoid using loops to reduce run time but at the same time I'm also lost as to how to do this.
I tried
C(:,:,:) = (A(B))
and
C(:,:,:) = (A(:,:,:,B))
but neither seem to do what I want it to do.
2 Comments
Guillaume
on 12 Sep 2019
Why is the index 2d and not 3d? Is it the same 4th dim index you want to pick for all 3 pages? I.e. should the index be repmat'ed across the 3rd dimension?
Answers (1)
Bruno Luong
on 12 Sep 2019
Edited: Bruno Luong
on 12 Sep 2019
It's amazing you all ask the same question, it must have some competition somewhere in the world (china?) about the topic of processing a stack of RGB images.
[m,n,p,~] = size(A);
x = m*n*p;
C = reshape(A((1:x)'+x*(repmat(B(:)-1,p,1))),[m,n,p]);
5 Comments
Bruno Luong
on 13 Sep 2019
Edited: Bruno Luong
on 13 Sep 2019
it computes the linear-index of each voxel on the "page" B.
You might interest in Andrei's use of NDGRID and SUB2IND. This is clearer coding though it requires 4/5 big temporary arrays.
My code is then more obscure but faster.
See Also
Categories
Find more on Matrices and Arrays in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!