# slicing an M-by-N-by-3 matrix using an M-by-N matrix of logical values

14 views (last 30 days)
Luca Amerio on 11 Apr 2018
Commented: Walter Roberson on 12 Apr 2018
Hi everybody
I have an RGB image as a MxNx3 matrix.
I would like to slice it using an MxN matrix of logic values (one for each pixel) and add a 1x1x3 value to those pixels. I'm trying to a clean way to do it.
In other words, I'm trying to do something like this
A = rand(200,200,3);
i = rand(200,200) > 0.5;
C = cat(3,0.3,0.4,0.2);
A(i) = 0.5*A(i,:) + 0.5*C; %doesn't work!
The only ways I found is either "unpacking" each MxN submatrix to a new variable like this
R = A(:,:,1);
G = A(:,:,2);
B = A(:,:,3);
R(i) = 0.5*R(i) + 0.5*C(1);
G(i) = 0.5*G(i) + 0.5*C(2);
B(i) = 0.5*B(i) + 0.5*C(3);
Anyone got a better idea?

Walter Roberson on 12 Apr 2018
A = A + repmat(i, [1, 1, 3]) .* repmat(C, [size(A,1), size(A,2), 1]);
Since R2016b this can be expressed as
A = A + i .* C;
##### 2 CommentsShowHide 1 older comment
Walter Roberson on 12 Apr 2018
dpb's Answer takes into account the selective 1/2 where mine does not. The fix would be
A = A + (C - A)/2 *.i;

dpb on 12 Apr 2018
A=0.5*(A.*i+C.*i);
Walter Roberson on 12 Apr 2018
Note that this requires R2016b or later due to differences in the sizes of the objects.