diff --git a/join.m b/join.m index 6e8148190551c09c5ca148e943d3f653a9e94375..9d01475d289a6179dc390e89f0668a87a3e91d1e 100644 --- a/join.m +++ b/join.m @@ -1,57 +1,91 @@ -function [Col,Lab,Off,varargout] = join(Cols,Labs,Offs,varargin) -%JOIN Summary of this function goes here +function [Lab,Off,varargout] = join(Labs,Offs,varargin) +%ALIGN Summary of this function goes here % Detailed explanation goes here -nvararg = nargin-3; +nvararg = nargin-2; numLab = numel(Labs); -Sizes = cell(1,numLab); +Maxs = cell(size(Labs)); + +filter = logical([1,1,0,0,0]); for lab = 1:numLab - if ~isempty(Cols{lab}) - break - end + if ~isempty(Offs{lab}); break; end end Off = Offs{lab}; -Max = size(Cols{lab}); -numDim = numel(Offs{lab}); +numDim = numel(Off); +Max = size(Labs{lab}); Max(end+1:numDim) = 1; -Max = Off+Max; +Max = Max+Off; for lab = 1:numLab - if isempty(Cols{lab}) - continue - end + if isempty(Labs{lab}); continue; end + + Maxs{lab} = size(Labs{lab}); + Maxs{lab}(end+1:numDim) = 1; + Maxs{lab} = Maxs{lab} + Offs{lab}; - Off = min(Off,Offs{lab}); - Sizes{lab} = size(Cols{lab}); - Sizes{lab}(end+1:numDim) = 1; - Max = max(Max,Offs{lab}+Sizes{lab}); + Off = min(Offs{lab},Off); + Max = max(Maxs{lab},Max); end Size = Max-Off; - -[Col,varargout{1:nvararg}] = deal(nan(Size)); Lab = zeros(Size); -for lab = 1:numLab - if isempty(Cols{lab}) - continue +[varargout,Size_it,Max_it,Maxs_it] = deal(cell(1,nvararg)); + +for it = 1:nvararg + for lab = 1:numLab + if ~isempty(varargin{it}{lab}) + break + end end - Mask = Labs{lab}==lab; + numDim = numel(Off); + Max_it{it} = size(varargin{it}{lab}); + Max_it{it}(end+1:numDim) = 1; + Max_it{it} = Max_it{it}+Off; + + for lab = 1:numLab + if isempty(varargin{it}{lab}); continue; end + + Maxs_it{it}{lab} = size(varargin{it}{lab}); + Maxs_it{it}{lab}(end+1:numDim) = 1; + Maxs_it{it}{lab} = Maxs_it{it}{lab} + Offs{lab}; + + Max_it{it} = max(Maxs_it{it}{lab},Max); + end + + Size_it{it} = Max_it{it}-Off; + varargout{it} = nan(Size_it{it}); +end + +for lab = 1:numLab + if isempty(Labs{lab}); continue; end + + padPre = Offs{lab}-Off; + padPost = Max-Maxs{lab}; + + padPre (~filter) = 0; + padPost(~filter) = 0; - gv = arrayfun(@(sl,ol,o) (1:sl)+ol-o,Sizes{lab},Offs{lab},Off,'UniformOutput',false); - GV = cell(1,numDim); - [GV{:}] = ndgrid(gv{:}); - inds = sub2ind(Size,GV{:}); - inds = inds(Mask(:)); + Lab_ = padarray(Labs{lab},padPre ,0,'pre' ); + Lab_ = padarray(Lab_ ,padPost,0,'post'); - Col(inds) = Cols{lab}(Mask(:)); - Lab(inds) = Labs{lab}(Mask(:)); + Lab(Lab_==lab) = lab; for it = 1:nvararg - varargout{it}(inds) = varargin{it}{lab}(Mask(:)); + %padPre = Offs{lab}-Off; + padPost = Max_it{it}-Maxs_it{it}{lab}; + + %padPre (~filter) = 0; + padPost(~filter) = 0; + + varargout_ = padarray(varargin{it}{lab},padPre ,nan,'pre' ); + varargout_ = padarray(varargout_ ,padPost,nan,'post'); + + Lab_it = Lab_.*ones(Size_it{it}); + varargout{it}(Lab_it==lab) = varargout_(Lab_it==lab); end end diff --git a/split.m b/split.m index a20e2a21434eeba60126f316573175943f3f5445..fbf93b7c87ffa9f8fda8f56bd53eed3df6cf3f62 100644 --- a/split.m +++ b/split.m @@ -5,9 +5,11 @@ function [Cols,Labs,Offs,varargout] = split(Col,Lab,Off,varargin) nvararg = nargin-3; numDim = numel(Off); numLab = max(Lab(:)); + [Cols,Labs,Offs,varargout{1:nvararg}] = deal(cell(1,numLab)); Offs(:) = deal({Off}); +Lab = Lab.*ones(size(Col)); for lab = 1:numLab if ~any(Lab(:)==lab)