我对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?

任何帮助,赞赏,

贾森

===============>>#1 票数: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

===============>>#2 票数:1

对于无向和未加权的图形,计算距离矩阵的另一种方法

如果您试图减少运行时间,可能会有所帮助。 在Matlab的情况下,大多数时候,我发现按入口扫描输入速度较慢。 我只是猜测你问这个问题的目的,对不起,如果我不在话题。

给定邻接Matix(G),我会按以下方式计算距离矩阵,

假设:1。G是无向和未加权的(矩阵填充'0'和'1')2。N是图的顺序,G的大小为N x 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
  • (i,j)“G power k”中的条目将给出从G到Vi的长度k的步数k
  • 最后,connect将告诉您图表是否已连接

===============>>#3 票数: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);

  ask by Jason translate from so

未解决问题?本站智能推荐: