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