我对MATLAB很新,并且有一段代码可以创建一个距离矩阵。更确切地说,它在位于无向图上的点之间创建距离矩阵D,使得Dij是该图上的点之间的最短路径。这个矩阵显然是对称的(因为图是无向的),以下是我用来创建它的代码片段:
D = zeros(size(data,1));
for i = 1:size(data, 1)
for j = 1:size(data, 1)
[D(i, j), ~, ~] = graphshortestpath(G, i, j, 'Directed', false);
end
end
这显然非常浪费,因为我没有利用矩阵的对称性。有什么方法我只能计算矩阵的上三角形部分然后以某种方式将下三角形部分“追加”到它,这样我就可以将计算从n ^ 2减少到n ^ 2/2?
任何帮助表示赞赏,
杰森
答案 0 :(得分:2)
不确定。只需考虑迭代的顺序,找出首先达到的三角形。
D = zeros(size(data,1));
for i = 1:size(data, 1)
for j = 1:size(data, 1)
if j > i
[D(i, j), ~, ~] = graphshortestpath(G, i, j, 'Directed', false);
else
D(i, j) = D(j, i);
end
end
end
如果对角线元素不相同,则可以使用if j >= i
代替。
答案 1 :(得分:1)
对于无向和未加权图,另一种计算距离矩阵的方法
如果您正在尝试减少运行时间,可能会有所帮助。在Matlab的情况下,大多数时候,我发现按入口扫描输入速度较慢。我只是猜测你问这个问题的目的,对不起,如果我不在话题。
给定邻接Matix(G),我会按照以下方式计算距离矩阵,
假设: 1. G是无向的&未加权(矩阵填充'0'和'1') 2.N是图的阶数,G的大小为N×N
function [D,connect]=genDistance(G,N)
D = G;
B = G;
connect = 0;
i=1;
while((~connect)&&(i<N-1)) % the maximum distance from one vert to another
i = i + 1; % is N-1
B = B * G; % G to the power of i
D = D + i * (D==0&B>0); % D==0 & B>0 the entries to be updated
connect = ( min(min(D)) )>0; %check if D has zero entry
end
D ( eye(N) ) = 0 ; %clear diagonal entries
答案 2 :(得分:0)
您可以使用
为矩阵G
的下半部分生成索引
N = length(G);
[irow, icol] = find(tril(ones(N),-1));
然后你可以遍历这些索引:
D = zeros(size(G));
for i = 1:numel(irow)
[D(irow(i), icol(i)] = graphshortestpath(G, irow(i), icol(i), 'Directed', false);
end
D = D + D';
另一个选择是使用带有索引的ARRAYFUN和SQUAREFORM将结果向量转换为方形矩阵:
D = arrayfun(@(x,y) graphshortestpath(G,x,y, 'Directed', false), irow, icol);
D = squareform(D);