To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Revision:

root / _FullBNT / BNT / graph / pred2path.m @ 8:b5b38998ef3b

History | View | Annotate | Download (2.08 KB)

1
function rte = pred2path(P,s,t)
2
%PRED2PATH Convert predecessor indices to shortest paths from node 's' to 't'.
3
%   rte = pred2path(P,s,t)
4
%     P = |s| x n matrix of predecessor indices (from DIJK)
5
%     s = FROM node indices
6
%       = [] (default), paths from all nodes
7
%     t = TO node indices
8
%       = [] (default), paths to all nodes
9
%   rte = |s| x |t| cell array of paths (or routes) from 's' to 't', where
10
%         rte{i,j} = path from s(i) to t(j)
11
%                  = [], if no path exists from s(i) to t(j)
12
%
13
% (Used with output of DIJK)
14

    
15
% Copyright (c) 1998-2001 by Michael G. Kay
16
% Matlog Version 5 22-Aug-2001
17

    
18
% Input Error Checking ******************************************************
19
error(nargchk(1,3,nargin));
20

    
21
[rP,n] = size(P);
22

    
23
if nargin < 2 | isempty(s), s = (1:n)'; else s = s(:); end
24
if nargin < 3 | isempty(t), t = (1:n)'; else t = t(:); end
25

    
26
if any(P < 0 | P > n)
27
   error(['Elements of P must be integers between 1 and ',num2str(n)]);
28
elseif any(s < 1 | s > n)
29
   error(['''s'' must be an integer between 1 and ',num2str(n)]);
30
elseif any(t < 1 | t > n)
31
   error(['''t'' must be an integer between 1 and ',num2str(n)]);
32
end
33
% End (Input Error Checking) ************************************************
34

    
35
rte = cell(length(s),length(t));
36

    
37
for i = 1:length(s)
38
   if rP == 1
39
      si = 1;
40
   else
41
      si = s(i);
42
      if si < 1 | si > rP
43
         error('Invalid P matrix.')
44
      end
45
   end
46
   for j = 1:length(t)
47
      tj = t(j);
48
      if tj == s(i)
49
         r = tj;
50
      elseif P(si,tj) == 0
51
         r = [];
52
      else
53
         r = tj;
54
         while tj ~= s(i)
55
            if tj < 1 | tj > n
56
               error('Invalid element of P matrix found.')
57
            end
58
            r = [P(si,tj) r];
59
            tj = P(si,tj);
60
         end
61
      end
62
      rte{i,j} = r;
63
   end
64
end
65

    
66
if length(s) == 1 & length(t) == 1
67
   rte = rte{:};
68
end
69

    
70
%rte = t;
71
while 0%t ~= s
72
   if t < 1 | t > n | round(t) ~= t
73
      error('Invalid ''pred'' element found prior to reaching ''s''');
74
   end
75
   rte = [P(t) rte];
76
   t = P(t);
77
end
78