1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
function C = accum_mask (C, Mask, accum, T, C_replace, Mask_complement)
%ACCUM_MASK apply the mask
% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
% SPDX-License-Identifier: Apache-2.0
[m n] = size (C.matrix) ;
Z.matrix = zeros (m, n) ;
Z.pattern = false (m, n) ;
if (isempty (accum))
Z = T ; % no accum operator
else
% Z = accum (C,T), like Z=C+T but with an binary operator, accum
p = C.pattern & T.pattern ; Z.matrix (p) = accum (C.matrix (p), T.matrix (p));
p = C.pattern & ~T.pattern ; Z.matrix (p) = C.matrix (p) ;
p = ~C.pattern & T.pattern ; Z.matrix (p) = T.matrix (p) ;
Z.pattern = C.pattern | T.pattern ;
end
% apply the mask to the values and pattern
C.matrix = mask (C.matrix, Mask, Z.matrix, C_replace, Mask_complement) ;
C.pattern = mask (C.pattern, Mask, Z.pattern, C_replace, Mask_complement) ;
end
function C = mask (C, Mask, Z, C_replace, Mask_complement)
% replace C if requested
if (C_replace)
C (:,:) = 0 ;
end
if (isempty (Mask)) % if empty, Mask is implicit ones(m,n)
% implicitly, Mask = ones (size (C))
if (~Mask_complement)
C = Z ; % this is the default
else
C = C ; % Z need never have been computed
end
else
% apply the mask
if (~Mask_complement)
C (Mask) = Z (Mask) ;
else
C (~Mask) = Z (~Mask) ;
end
end
end
|