How to use a 2D index to create a 3D array from a 4D array?

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

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?
The each of the 4th dimension is the same for all 3 pages

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Bruno Luong
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

Ha, I totally recognized the question too while I was reading it.
I detect at least three guys around the table. ;-)
What does this bit in your third line of your code do?
(1:x)'+x*(repmat(B(:)-1,p,1))
Bruno Luong
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.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Matrices and Arrays finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2019a

Gefragt:

am 12 Sep. 2019

Kommentiert:

am 13 Sep. 2019

Community Treasure Hunt

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

Start Hunting!

Translated by