/
distance_wei.m
71 lines (66 loc) · 2.89 KB
/
distance_wei.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function [D B]=distance_wei(L)
%DISTANCE_WEI Distance matrix
%
% D = distance_wei(L);
% [D B] = distance_wei(L);
%
% The distance matrix contains lengths of shortest paths between all
% pairs of nodes. An entry (u,v) represents the length of shortest path
% from node u to node v. The average shortest path length is the
% characteristic path length of the network.
%
% Input: L, Directed/undirected connection-length matrix.
% *** NB: The length matrix L isn't the weights matrix W (see below) ***
%
% Output: D, distance (shortest weighted path) matrix
% B, number of edges in shortest weighted path matrix
%
% Notes:
% The input matrix must be a connection-length matrix, typically
% obtained via a mapping from weight to length. For instance, in a
% weighted correlation network higher correlations are more naturally
% interpreted as shorter distances and the input matrix should
% consequently be some inverse of the connectivity matrix.
% The number of edges in shortest weighted paths may in general
% exceed the number of edges in shortest binary paths (i.e. shortest
% paths computed on the binarized connectivity matrix), because shortest
% weighted paths have the minimal weighted distance, but not necessarily
% the minimal number of edges.
% Lengths between disconnected nodes are set to Inf.
% Lengths on the main diagonal are set to 0.
%
% Algorithm: Dijkstra's algorithm.
%
%
% Mika Rubinov, UNSW/U Cambridge, 2007-2012.
% Rick Betzel and Andrea Avena, IU, 2012
%Modification history
%2007: original (MR)
%2009-08-04: min() function vectorized (MR)
%2012: added number of edges in shortest path as additional output (RB/AA)
%2013: variable names changed for consistency with other functions (MR)
n=length(L);
D=inf(n);
D(1:n+1:end)=0; %distance matrix
B=zeros(n); %number of edges matrix
for u=1:n
S=true(1,n); %distance permanence (true is temporary)
L1=L;
V=u;
while 1
S(V)=0; %distance u->V is now permanent
L1(:,V)=0; %no in-edges as already shortest
for v=V
T=find(L1(v,:)); %neighbours of shortest nodes
[d wi]=min([D(u,T);D(u,v)+L1(v,T)]);
D(u,T)=d; %smallest of old/new path lengths
ind=T(wi==2); %indices of lengthened paths
B(u,ind)=B(u,v)+1; %increment no. of edges in lengthened paths
end
minD=min(D(u,S));
if isempty(minD)||isinf(minD), %isempty: all nodes reached;
break, %isinf: some nodes cannot be reached
end;
V=find(D(u,:)==minD);
end
end