How to use a 2D index to create a 3D array from a 4D array?
Ältere Kommentare anzeigen
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 Kommentare
Guillaume
am 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?
Janette Lin
am 12 Sep. 2019
Antworten (1)
Bruno Luong
am 12 Sep. 2019
Bearbeitet: Bruno Luong
am 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 Kommentare
Bob Thompson
am 12 Sep. 2019
Ha, I totally recognized the question too while I was reading it.
Bruno Luong
am 12 Sep. 2019
I detect at least three guys around the table. ;-)
Janette Lin
am 13 Sep. 2019
Bruno Luong
am 13 Sep. 2019
Bearbeitet: Bruno Luong
am 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.
Andrei Bobrov
am 13 Sep. 2019
+1
Kategorien
Mehr zu Matrices and Arrays finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!