MATLAB函数图不返回对称矩阵的最短路径
我使用MATLAB函数graphallshortestpaths来计算无向网络顶点之间的最短路径。无向网络以加权边列表文件的形式给出,您可以找到该文件 这是我用来计算最短路径的MATLAB代码:MATLAB函数图不返回对称矩阵的最短路径,matlab,shortest-path,adjacency-matrix,Matlab,Shortest Path,Adjacency Matrix,我使用MATLAB函数graphallshortestpaths来计算无向网络顶点之间的最短路径。无向网络以加权边列表文件的形式给出,您可以找到该文件 这是我用来计算最短路径的MATLAB代码: A=load('genome_edge_list'); %Extract the edges E=[A(:,1);A(:,2)]; %Extract the vertices V=unique(E); %N is the number of vertices N=length(V); %T
A=load('genome_edge_list');
%Extract the edges
E=[A(:,1);A(:,2)];
%Extract the vertices
V=unique(E);
%N is the number of vertices
N=length(V);
%Take the inverse of the weights
A(:,3)=1./A(:,3);
%Create a sparse weighted adjacency matrix
B=sparse(A(:,1),A(:,2),A(:,3),N,N);
%Make B symmetric
B=sparse(full(B)+full(B)');
%Compute shortest paths
D=graphallshortestpaths(B,'directed',false);
现在,MATLAB作为输出给出的矩阵D是不对称的。但是,由于GraphallShortestPath的输入是稀疏格式的对称矩阵,因此输出应该是对称矩阵。那么我做错了什么
在mathworks上我能找到的唯一相关问题是问题,但是在这个问题上,OP显然没有给出一个对称矩阵作为输入,这解释了为什么MATLAB返回的矩阵是不对称的
编辑:
为了了解D和D'之间的距离,我计算了以下值:
E=D';
C=D==E;
find(C==0)
这将返回以下线性索引:
33133
543038
1363077
1398421
1398786
1399373
但这些指数的D和E值相同,例如D(33133)=0.1024=E(33133)。现在,如果我取两个矩阵的差,那么我发现这些指数的差是-1.0000e-05。因此,正如@bicker所指出的,这似乎是一个舍入错误。然而,正如我在下面的评论中所写,我不明白这是如何发生的,因为graphsallshortestpaths只计算节点I和j之间的距离一次,因此D(I,j)和D(I,j)的值应该是相同计算的结果 夫妇或备注:
- 正如@bicker在评论中提到的,这很可能是一个数字问题。我会特别厌倦这样一行:你取反方向,做
A(:,3)=1./A(:,3)代码>。试着输出一些调试值,看看这个逆函数是否达到了预期的效果
- 在使
对称的行上:是否确实要执行B
而不是full(B)
?第一个是厄米特,第二个是转置李>full(B)。
- 同样在使
对称的同一行上:可能缺少B
因子?因此,不是0.5
B=sparse(full(B)+full(B)”代码>类似于
B=sparse((满(B)+满(B)。*0.5)代码>(请参阅)
我还认为你无意中在第二行写了
H
,而不是E
,对吗?数值相差多远?我唯一能想到的就是浮点精度。另外,我认为第三行应该是V=unique(E)
因为H
未定义,但我看不出这怎么会导致问题,即使H
已在其他地方定义。@bicker谢谢,这是一个输入错误。我用C=D==D.
和find(C==0)
给了我一个包含六个索引的列表,其中D和D.“应该是不同的。然而,这些指数的值是相同的,所以我不明白为什么issymmetric(D)
返回0。一个小例子会有所帮助。@bicker,我通过计算两个矩阵的差值再次检查,在这六个指数上,它们的差值为-1.0000e-05。所以这似乎是一个取整问题。但是,我看不出它发生在哪里,因为节点I和节点j之间的距离应该只通过graphsallshortestpaths计算一次,所以D(j,I)处的值应该与D(I,j)处的值相同。@Biker我将为这个问题添加一个示例。谢谢您的评论。即使我不取权重的倒数issymmetric(D)
仍然返回0,并且行A(:,3)=1./A(:,3)
实际上执行了我希望它执行的操作。至于你的第二句话,因为我处理的是实数,所以不管我是采用厄米变换还是转置都没有区别。最后,因为我有一个无向图的加权边列表,列表中没有重复的边,向矩阵自身添加转置是获得加权对称邻接矩阵的正确方法,因为我不会复制任何值,而使用(full(B)+full(B)。*05
我会将所有权重一分为二,这不是我想要做的。