[10] | 1 | %NHGRAPH Find a neighborhood graph and its shortest paths
|
---|
| 2 | %
|
---|
| 3 | % [NG,L,DL,D] = NHGRAPH(A,OPT,PAR)
|
---|
| 4 | %
|
---|
| 5 | % INPUT
|
---|
| 6 | % A NxN Weight (dissimilarity) matrix/dataset representing a weighted graph
|
---|
| 7 | % OPT Option method (optional; default: 'MST')
|
---|
| 8 | % 'NN' - based on nearest neighbor neighborhoods
|
---|
| 9 | % 'MST' - based on minimum spanning trees (MSTs)
|
---|
| 10 | % 'EPS' - based on eps-neighborhoods
|
---|
| 11 | % 'MST-NN' - based on a single MST followed by nearest neighbor neighborhoods
|
---|
| 12 | % 'MST-EPS'- based on a single MST followed by eps-neighborhoods
|
---|
| 13 | % PAR Parameter (optional; default: 3 for 'NN' and 'MST-NN'; 1 for 'MST';
|
---|
| 14 | % 0.1*avr(W) for 'EPS' and 'MST-EPS')
|
---|
| 15 | % Integer K, 1<=K<N, for 'NN', 'MST-NN'
|
---|
| 16 | % Integer K, 1<=K<N, for 'MST'
|
---|
| 17 | % Real positive value for 'EPS', 'MST-EPS'
|
---|
| 18 | %
|
---|
| 19 | % OUTPUT
|
---|
| 20 | % NG NxN Weight matrix (dataset) representing the neighborhood graph
|
---|
| 21 | % L List of edges in the neighborhood graph
|
---|
| 22 | % DL List of edge weights of the neighborhood graph
|
---|
| 23 | % D NxN matrix of shortest paths
|
---|
| 24 | %
|
---|
| 25 | % DESCRIPTION
|
---|
| 26 | % Finds a neighborhood graph for the graph described by the weight matrix A.
|
---|
| 27 | % A is NxN matrix representing a graph G(V,E). V is a set of vertices, |V| = N,
|
---|
| 28 | % and E is a set of edges. If there is no edge between i and j then A(i,j) = INF.
|
---|
| 29 | %
|
---|
| 30 | % DEFAULT
|
---|
| 31 | % M = 'MST'
|
---|
| 32 | % PAR = 3 ('NN','MST-NN'), 1 ('MST') or 0.1*avr(W) ('EPS','MST-EPS')
|
---|
| 33 | %
|
---|
| 34 | % SEE ALSO
|
---|
| 35 | % KMST, DSPATH, DSPATHS
|
---|
| 36 |
|
---|
| 37 | % Elzbieta Pekalska, ela.pekalska@googlemail.com
|
---|
| 38 | % Faculty of EWI, Delft University of Technology, The Netherlands and
|
---|
| 39 | % School of Computer Science, University of Manchester
|
---|
| 40 |
|
---|
| 41 |
|
---|
| 42 | function [V,L,DL,D] = nhgraph(A,opt,par)
|
---|
| 43 |
|
---|
| 44 | if nargin < 2 | isempty(opt),
|
---|
| 45 | opt = 'MST';
|
---|
| 46 | end
|
---|
| 47 |
|
---|
| 48 | opt = upper(opt);
|
---|
| 49 | if nargin < 3 | isempty(par),
|
---|
| 50 | switch opt
|
---|
| 51 | case 'MST', par = 1;
|
---|
| 52 | case {'MST','NN','MST-NN'}, par = 3;
|
---|
| 53 | case {'EPS','MST-EPS'}, par = 0.1*mean(A(:));
|
---|
| 54 | otherwise
|
---|
| 55 | error(['Wrong method', opt]);
|
---|
| 56 | end
|
---|
| 57 | end
|
---|
| 58 |
|
---|
| 59 |
|
---|
| 60 | V = +A;
|
---|
| 61 | [n,m] = size(V);
|
---|
| 62 | if n~= m,
|
---|
| 63 | error('Weight matrix A should be square.');
|
---|
| 64 | end
|
---|
| 65 |
|
---|
| 66 |
|
---|
| 67 | L = [];
|
---|
| 68 | DL = [];
|
---|
| 69 | switch opt
|
---|
| 70 | case 'MST'
|
---|
| 71 | [L,DL,V] = kmst(V,par);
|
---|
| 72 |
|
---|
| 73 | case {'NN', 'MST-NN'}
|
---|
| 74 | K = par;
|
---|
| 75 | if K ~= round(K) | K < 2 | K >= n,
|
---|
| 76 | error ('K should be the number of nearest neighbors.');
|
---|
| 77 | end
|
---|
| 78 | if strcmp(opt,'MST-NN'),
|
---|
| 79 | [L,DL,V] = kmst(V,1);
|
---|
| 80 | end
|
---|
| 81 | [VV,I] = sort(V);
|
---|
| 82 | for i=1:n
|
---|
| 83 | V(i,I((2+K):end,i)) = inf;
|
---|
| 84 | end
|
---|
| 85 | if nargout > 1,
|
---|
| 86 | for i=1:n
|
---|
| 87 | L = [L; i*ones(K,1) I(2:1+K,i)];
|
---|
| 88 | DL = [DL; VV(i,I(2:1+K,i))'];
|
---|
| 89 | end
|
---|
| 90 | end
|
---|
| 91 |
|
---|
| 92 | case {'EPS','MST-EPS'}
|
---|
| 93 | if strcmp(opt,'MST-EPS')
|
---|
| 94 | [L,DL,V] = kmst(V,1);
|
---|
| 95 | end
|
---|
| 96 | deps = par;
|
---|
| 97 | if deps <= 0,
|
---|
| 98 | error ('EPS should be positive.');
|
---|
| 99 | end
|
---|
| 100 | warning off;
|
---|
| 101 | V = V./(V <= deps);
|
---|
| 102 | V = min(V,inf);
|
---|
| 103 | if nargout > 1,
|
---|
| 104 | [I J] = find(V < inf);
|
---|
| 105 | L = [L; I J];
|
---|
| 106 | DL = [DL; V(J*(n-1)+I)];
|
---|
| 107 | end
|
---|
| 108 | warning on;
|
---|
| 109 | otherwise
|
---|
| 110 | error('Unknown method.')
|
---|
| 111 | end
|
---|
| 112 |
|
---|
| 113 | LL = [L; L(:,[2 1])];
|
---|
| 114 | V = inf*ones(n,m);
|
---|
| 115 | V((LL(:,2)-1)*n+LL(:,1)) = +A((LL(:,2)-1)*n+LL(:,1));
|
---|
| 116 |
|
---|
| 117 | if isdataset(A),
|
---|
| 118 | V = setdata(A,V);
|
---|
| 119 | end
|
---|
| 120 |
|
---|
| 121 | if nargout > 3,
|
---|
| 122 | D = dspaths(V);
|
---|
| 123 | end
|
---|
| 124 | return;
|
---|