# Apply a mask to 4D medical images in a vectorized way

36 views (last 30 days)
AP on 11 Feb 2013
Dear All,
I have a 4D array V, with the size [144 144 12 25]. In fact, it is a 4D medical image with 12 stacked slices in 25 different time. I want to apply a mask, named M, to each image in the array in a vectorized way. M is a 144x144 array containing logical values. Could someone help me how to do it?
Thanks,

#### 1 Comment

José-Luis on 11 Feb 2013

José-Luis on 11 Feb 2013
Edited: José-Luis on 12 Feb 2013
data = rand(144,144,12,25);
Assuming you want to multiply by the mask:
Note that you can do operations other than multiplication. Please have a look at
doc bsxfun

Show 1 older comment
Sean de Wolski on 11 Feb 2013
Isn't that what you want?
+1
AP on 11 Feb 2013
I want the operation on each image. I thought bsxfun is only for each pixel and can't be applied to each image in a 4D array. Please correct me if I am wrong: so when we call bsxfun(@times,data,mask), bsxfun applies the mask to each 144x144. Is that right?
José-Luis on 12 Feb 2013
Yes. That's what the "singleton expansion" in the documentation means.

Something like this:
fV = V.*M(:,:,ones(1,size(V,3)),ones(1,size(V,4)));

AP on 11 Feb 2013
How can I convert M, with size [144 144] to M with [144 144 12 25]?
AP on 11 Feb 2013
I think, I have to use
repmat(M, [1 1 size(V,3) size(V,4)])
to duplicate M in other dimensions and make it [144 144 12 25].