www.gusucode.com > mbcdata 工具箱 matlab 源码程序 > mbcdata/@cgprojconnections/sort.m

    function [A,SortedIndex]= sort(A,SortBy,index)
%SORT sort CAGE project
% 
% [A,SortedIndex]= sort(A,SortBy,index);
%    SortBy is {'eval','reverse', 'names' , 'types'}
%    index  sort part of project specified by indices

%  Copyright 2004 The MathWorks, Inc.

if nargin<2
    SortBy = 'eval';
end
if nargin>2
    A= subsref(A,substruct('()',{index}));
end

C= A.Connections;
index= 1:size(C,1);


switch lower(SortBy)
    case {'eval','reverse'}
        [notused,SortedIndex]= iSort(C,SortBy);
    case 'names'
        [notused,SortedIndex]= sort(A.Names);
    case 'types'
        [notused,SortedIndex]= sort(A.Type);
end
    
SortedIndex = index(SortedIndex);

A= subsref(A,substruct('()',{SortedIndex}));







function [Adj,reOrder,loop]= iSort(Adj,SortOrder)

N= size(Adj,1);
reOrder= 1:N;
loop= false;
for i=1:N
    
    if any(Adj(i,:))
        % find any inputs in expressions i+1:N
        p= find(Adj(i,i+1:N));
        
        swap= ~isempty(p);
        loop= Adj(i,i);
        OrigIndex= reOrder(i);
        while swap && ~loop
            p= p+i;
            reOrder([i p])= reOrder([p i]);
            % swap elements in adjaceny matrix
            Adj( [i p], :)= Adj([p i], :);
            Adj( :, [i p])= Adj(:, [p i]);
            
            % find next swap
            p= find(Adj(i,i+1:N));
            swap= ~isempty(p);
            % loop if link to self or the original node is back at start
            loop= Adj(i,i) || reOrder(i)== OrigIndex;
        end
        
        if loop
            % loop detected so stop now
            break;
        end
    end
        
end

if nargin>1 && strcmp(SortOrder,'reverse')
    reOrder= reOrder(end:-1:1);
    Adj= Adj(end:-1:1,:);
    Adj= Adj(:,end:-1:1);
end