www.gusucode.com > mbc 工具箱 matlab 源码程序 > mbc/@mbcfoundation/@gridDefinition/fixMerge.m

    function fixMerge(obj)
%FIXMERGE Make sure merging setup is valid
%
%  FIXMERGE(OBJ) ensures that there are no merge blocks defined that go
%  beyond the size of the grid.

%  Copyright 2000-2010 The MathWorks, Inc. and Ford Global Technologies, Inc.


if obj.DoMerge
    mergeSize = size(obj.MergeNRows);

    if obj.Rows > mergeSize(1)
        obj.MergeNRows(obj.Rows,end)= uint16(0);
        obj.MergeNCols(obj.Rows,end)= uint16(0);
    elseif obj.Rows < mergeSize(1)
        obj.MergeNRows = obj.MergeNRows(1:obj.Rows,:);
        obj.MergeNCols = obj.MergeNCols(1:obj.Rows,:);
        % check the merge blocks don't overrun rows matrix
        obj.MergeNRows = i_clipmergeblocks(obj.MergeNRows,1);
    end
    if obj.Columns > mergeSize(2)
        obj.MergeNRows(end,obj.Columns)= uint16(0);
        obj.MergeNCols(end,obj.Columns)= uint16(0);
    elseif obj.Columns < mergeSize(2)
        obj.MergeNRows=obj.MergeNRows(:,1:obj.Columns);
        obj.MergeNCols=obj.MergeNCols(:,1:obj.Columns);
        % check the merge blocks don't overrun cols matrix
        obj.MergeNCols = i_clipmergeblocks(obj.MergeNCols,2);
    end
end

function data = i_clipmergeblocks(data,dim)
% find non-zero values and ensure their position + value is not greater than maxsz
I = find(data)';
sz = size(data);
if dim==1
    k = ind2sub(sz,I);
else
    [k,k] = ind2sub(sz,I);
end
for n = 1:length(I)
    if (data(I(n))+k(n)-1) > sz(dim)
        data(I(n)) = uint16(sz(dim)-k(n)+1);
    end
end