Изначально я пытался заставить его работать, используя imresize
, но не мог получить его без "хаков" (во всех моих "правильных" попытках он был выключен на 1).
imresize(M, ceil(size(M)/2), 'bilinear') >= 0.4 % This works but is hacky and not recommended!
Тем не менее, я могу придумать, как решить эту проблему с помощью двумерной свертки. Обратите внимание, что я дополняю массив (для которого требуется набор инструментов), чтобы упростить этап индексации в конце:
function C = q53247013(M)
if nargin < 1
M = [
1 0 0 1 0
0 1 1 0 0
1 1 0 0 0
0 1 1 1 0
0 0 1 1 0
1 0 0 1 0];
end
% Constants:
BLK_SZ = 2;
A = ones(BLK_SZ);
% Pad array if needed (note: this WILL require modification if BLK_SZ > 2 ):
padBottom = rem(size(M,BLK_SZ),1);
padRight = rem(size(M,BLK_SZ),2);
M = padarray(M, [padBottom, padRight], 'replicate', 'post');
% Perform convolution:
C = conv2(M, A, 'valid') >= ceil(BLK_SZ^2 / 2);
% Remove every other row and column:
C = C(1:2:end, 1:2:end);
Другой альтернативой является функция blockproc
:
C = blockproc(M, [2 2], @(x)sum(x.data(:))) >= 2;