make_layout.m
来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· M 代码 · 共 171 行
M
171 行
function [x, y] = layout_dag(adj)% MAKE_LAYOUT Creates a layout from an adjacency matrix%% [X, Y] = MAKE_LAYOUT(ADJ)%% Inputs :% ADJ = adjacency matrix (source, sink)%% Outputs :% X, Y : Positions of nodes%% Usage Example : [X, Y] = make_layout(adj);%%% Note : Uses some very simple heuristics, so any other% algorithm would create a nicer layout %% See also % Uses :% Change History :% Date Time Prog Note% 13-Apr-2000 8:25 PM ATC Created under MATLAB 5.3.1.29215a (R11.1)% ATC = Ali Taylan Cemgil,% SNN - University of Nijmegen, Department of Medical Physics and Biophysics% e-mail : cemgil@mbfys.kun.nl N = size(adj,1);tps = toposort(adj);if ~isempty(tps), % is directed ? level = zeros(1,N); for i=tps, idx = find(adj(:,i)); if ~isempty(idx), l = max(level(idx)); level(i)=l+1; end; end;else level = poset(adj,1)'-1; end;y = (level+1)./(max(level)+2);y = 1-y;x = zeros(size(y));for i=0:max(level), idx = find(level==i); offset = (rem(i,2)-0.5)/10; x(idx) = (1:length(idx))./(length(idx)+1)+offset;end;%%%%%%%function [depth] = poset(adj, root)% POSET Identify a partial ordering among the nodes of a graph% % [DEPTH] = POSET(ADJ,ROOT)% % Inputs :% ADJ : Adjacency Matrix% ROOT : Node to start with% % Outputs :% DEPTH : Depth of the Node% % Usage Example : [depth] = poset(adj,12);% % % Note : All Nodes must be connected% See also % Uses :% Change History :% Date Time Prog Note% 17-Jun-1998 12:01 PM ATC Created under MATLAB 5.1.0.421% ATC = Ali Taylan Cemgil,% SNN - University of Nijmegen, Department of Medical Physics and Biophysics% e-mail : cemgil@mbfys.kun.nl adj = adj+adj';N = size(adj,1);depth = zeros(N,1);depth(root) = 1;queue = root;while 1, if isempty(queue), if all(depth), break; else root = find(depth==0); root = root(1); depth(root) = 1; queue = root; end; end; r = queue(1); queue(1) = []; idx = find(adj(r,:)); idx2 = find(~depth(idx)); idx = idx(idx2); queue = [queue idx]; depth(idx) = depth(r)+1;end;%%%%%%%%%function [seq] = toposort(adj)% TOPOSORT A Topological ordering of nodes in a directed graph% % [SEQ] = TOPOSORT(ADJ)% % Inputs :% ADJ : Adjacency Matrix. % ADJ(i,j)==1 ==> there exists a directed edge% from i to j% % Outputs :% SEQ : A topological ordered sequence of nodes.% empty matrix if graph contains cycles.%% Usage Example : % N=5;% [l,u] = lu(rand(N));% adj = ~diag(ones(1,N)) & u>0.5; % seq = toposort(adj);% % % Note :% See also % Uses :% Change History :% Date Time Prog Note% 18-May-1998 4:44 PM ATC Created under MATLAB 5.1.0.421% ATC = Ali Taylan Cemgil,% SNN - University of Nijmegen, Department of Medical Physics and Biophysics% e-mail : cemgil@mbfys.kun.nl N = size(adj);indeg = sum(adj,1);outdeg = sum(adj,2);seq = [];for i=1:N, % Find nodes with indegree 0 idx = find(indeg==0); % If can't find than graph contains a cycle if isempty(idx), seq = []; break; end; % Remove the node with the max number of connections [dummy idx2] = max(outdeg(idx)); indx = idx(idx2); seq = [seq, indx]; indeg(indx)=-1; idx = find(adj(indx,:)); indeg(idx) = indeg(idx)-1;end;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?