| function y = vl_nnSubP(x, dzdy, varargin)
|
|
|
|
|
| opts.scale = 2;
|
| opts = vl_argparse(opts, varargin, 'nonrecursive') ;
|
| scale = opts.scale;
|
|
|
| if scale > 1
|
| scale2 = scale^2;
|
| if nargin <= 1 || isempty(dzdy)
|
| [hei,wid,channelI,bsize] = size(x);
|
| channelO = channelI/scale2;
|
| channelI_start = 0;
|
| idx1 = scale * (1:hei);
|
| idx2 = scale * (1:wid);
|
| y = zeros([scale*hei, scale*wid, channelO, bsize],'like',x);
|
| for nchannelO = 1:channelO
|
| for i = 1:scale2
|
| a = mod(i-1, scale) + 1;
|
| b = floor((i-1)/scale) + 1;
|
| y(idx1+a-scale, idx2+b-scale, nchannelO, :) = x(:,:,channelI_start+i,:);
|
| end
|
| channelI_start = scale2 + channelI_start;
|
| end
|
| else
|
| [hei,wid,channelO,bsize] = size(dzdy);
|
| idx1 = 1:scale:hei;
|
| idx2 = 1:scale:wid;
|
| channelI = channelO*scale2;
|
| channelI_start = 0;
|
| y = zeros([hei/scale, wid/scale, channelI, bsize],'like',x);
|
| for nchannelO = 1:channelO
|
| for i = 1:scale^2
|
| a = mod(i-1, scale) + 1;
|
| b = floor((i-1)/scale) + 1;
|
| y(:, :, channelI_start+i, :) = dzdy(idx1+a-1, idx2+b-1,nchannelO,:);
|
| end
|
| channelI_start = scale2 + channelI_start;
|
| end
|
| end
|
|
|
| else
|
|
|
| scale = round(1/scale);
|
| scale2 = scale^2;
|
| if nargin <= 1 || isempty(dzdy)
|
| [hei,wid,channelO,bsize] = size(x);
|
| idx1 = 1:scale:hei;
|
| idx2 = 1:scale:wid;
|
| channelI = channelO*scale2;
|
| channelI_start = 0;
|
| y = zeros([hei/scale, wid/scale, channelI, bsize],'like',x);
|
| for nchannelO = 1:channelO
|
| for i = 1:scale^2
|
| a = mod(i-1, scale) + 1;
|
| b = floor((i-1)/scale) + 1;
|
| y(:, :, channelI_start+i, :) = x(idx1+a-1, idx2+b-1,nchannelO,:);
|
| end
|
| channelI_start = scale2 + channelI_start;
|
| end
|
| else
|
| [hei,wid,channelI,bsize] = size(dzdy);
|
| channelO = channelI/scale2;
|
| channelI_start = 0;
|
| idx1 = scale * (1:hei);
|
| idx2 = scale * (1:wid);
|
| y = zeros([scale*hei, scale*wid, channelO, bsize],'like',x);
|
| for nchannelO = 1:channelO
|
| for i = 1:scale2
|
| a = mod(i-1, scale) + 1;
|
| b = floor((i-1)/scale) + 1;
|
| y(idx1+a-scale, idx2+b-scale, nchannelO, :) = dzdy(:,:,channelI_start+i,:);
|
| end
|
| channelI_start = scale2 + channelI_start;
|
| end
|
| end
|
| end
|
|
|
|
|