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

我使用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); 

%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
我会将所有权重一分为二,这不是我想要做的。