2017-05-01 101 views
2

我正在使用MATLAB函數graphallshortestpaths來計算無向網絡頂點之間的最短路徑。無向網絡作爲加權邊緣列表文件給出,您可以在其中找到hereMATLAB函數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不是對稱的。但是,由於輸入到graphallshortestpaths是稀疏格式的對稱矩陣,輸出應該是對稱矩陣。那麼我做錯了什麼?

我在mathworks上可以找到的唯一相關問題是this問題,但是在那個問題中,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。 @beaker指出,因此它似乎是一個四捨五入的錯誤。然而,正如我在下面的評論中寫的,我不明白這是怎麼發生的,因爲圖的最短路徑計算節點i和j之間的距離只有一次,因此D(i,j)和D(i,j)應該是相同計算的結果。

+1

數值有多遠?我唯一能想到的就是浮點精度。另外,我認爲第三行應該是'V = unique(E);'因爲'H'沒有定義,但是我不明白這是否會導致問題,即使'H'已經在其他地方定義了。 – beaker

+0

@beaker謝謝,那是一個錯字。我用'C = D == D.''檢查了值的大小,'find(C == 0)'給了我一個D和D的六個索引列表。應該是不同的。然而,這些指數的值是相同的,所以我很困惑爲什麼'對稱(D)'返回0。 –

+0

一個小例子會有所幫助。 – beaker

回答

0

情侶或備註:

  • 正如在評論中提及@beaker,它很可能是一個數字問題。我會特別厭倦你採取相反的行,並做A(:,3)=1./A(:,3);。嘗試輸出一些調試值,看看這個反轉是否符合你的意圖。
  • 在你所在的線上B symmetric:你確定你想要做full(b)'而不是full(b).'?第一個是厄米特人,第二個是轉座!
  • 也在同一行上,你製作B symmetric:或許你錯過了0.5因素呢?所以,而不是B=sparse(full(B)+full(B)');B=sparse((full(B)+full(B).').*0.5);(見this answer)。

我也覺得你無意中在第二行寫了H而不是E對不對?

+0

感謝您的評論。即使我不接受權重的反函數,「對稱(D)」仍然返回0,並且行'A(:3)= 1/A(:,3)'實際上做了我想要的做。至於你的第二個評論,因爲我正在處理實數,所以我採取厄米特或轉置並不重要。 –

+0

最後,因爲我有一個無向圖的加權邊的列表,在列表中沒有邊的重複,所以將矩陣的轉置添加到它本身是獲得加權對稱鄰接矩陣的正確方法,因爲我不會('full(B)+ full(B)')* 05'將所有權重分成兩半,這不是我想要做的。 –