![](/img/trans.png)
[英]MATLAB: Fast creation of random symmetric Matrix with fixed degree (sum of rows)
[英]Cost-effective creation of a symmetric matrix in MATLAB
我对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?
任何帮助,赞赏,
贾森
当然。 只需考虑迭代的顺序,找出首先达到的三角形。
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
。
对于无向和未加权的图形,计算距离矩阵的另一种方法
如果您试图减少运行时间,可能会有所帮助。 在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
您可以为矩阵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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.