2017-05-01 17 views
2

방향없는 네트워크의 꼭짓점 사이의 최단 경로를 계산하기 위해 MATLAB 함수 graphallshortestpaths를 사용하고 있습니다. 방향이 지정되지 않은 네트워크는 가중 에지 목록 파일로 제공되며 here을 찾을 수 있습니다.MATLAB 함수 graphallshortestpath가 대칭 행렬을 반환하지 않습니다.

이 I 최단 경로를 계산하는 데 사용 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가 지적했듯이 반올림 오류 인 것 같습니다. 그러나, 아래에 내 의견을 쓸 때 graphsallshortestpaths는 노드 i와 j 사이의 거리를 한 번만 계산하므로 D (i, j)와 D (i, j)의 값은 한 번만 계산되므로 어떻게 발생하는지 이해할 수 없습니다. 같은 계산의 결과 여야합니다.

+1

값은 얼마나 떨어져 있습니까? 내가 생각할 수있는 유일한 점은 부동 소수점 정밀도입니다. 또한, 제 3 행은'V = unique (E);'H'가 정의되어 있지 않아야한다고 생각합니다. 그러나'H'가 다른 곳에서 이미 정의 되었더라도 그 문제를 일으킬 수는 없습니다. – beaker

+0

@ 비커 덕분에 오타가되었습니다. 나는 'C = D == D'와 'find (C == 0)'값이 얼마나 떨어져 있는지 확인해 봤는데 D와 D에 대한 6 개의 인덱스 목록을 제공한다. ' 다를 것입니다. 그러나 이러한 인덱스의 값은 동일하므로'issymmetric (D)'이 0을 반환하는 이유에 대해 당황 스럽습니다. –

+0

작은 예제가 도움이 될 것입니다. – beaker

답변

0

커플이나 발언 :

  • 주석에서 언급 @beaker, 그것은 잘 수치 문제가 될 수 있습니다. 나는 당신이 역행렬을 취하는 선을 특히 피곤할 것이고 A(:,3)=1./A(:,3);을 할 것이다. 일부 디버그 값을 출력하고이 역함이 의도 한 바를 수행하는지보십시오.
  • B 대칭을 사용하는 행에서 full(b)'을 입력하고 full(b).'이 아닌지 확인 하시겠습니까? 첫 번째는 hermitian을, 두 번째는 transpose를 취합니다!
  • B 대칭을 사용하는 동일한 줄에 0.5 요소가 누락 되었습니까? 따라서 B=sparse((full(B)+full(B).').*0.5); (this answer 참조)과 같은 B=sparse(full(B)+full(B)'); 대신.

실수로 두 번째 줄에 E 대신 H을 썼다고 생각하십니까?

+0

고마워요. 'A (:, 3) = 1./A (:, 3)'줄은 실제로 가중치의 역함수를 취하지 않아도''대칭 (D)'이 여전히 0을 반환하고 실제로 해야 할 것. 두 번째 발언에 관해서는, 내가 실수를 다루고 있기 때문에 나는 hermitian 또는 transpose를 취하고 있는지 여부에 차이를 만들지 않습니다. –

+0

마지막으로, 방향이없는 그래프의 가중치가있는 가장자리 목록이 있으므로 목록의 가장자리를 반복하지 않고 행렬의 조 변경을 자체에 추가하면 가중치가있는 대칭 인접 행렬을 얻는 올바른 방법입니다. * (전체 (B) + 전체 (B)) * 05'로 모든 가중치를 반으로 나눌 것입니다. 이는 내가 원하는 것과 다릅니다. –