2015-05-19 44 views
1

所以我試圖創建一個鄰接矩陣,我對accumarray(matrix+1,1)accumarray(matrix,1)之間的區別感到困惑。matlab - Accumarray Adjacency Matrix Confusion?

我所做的:

matrix = [ 1 3 
      4 2 
      1 3 
      3 1] 

adMatrix1 = accumarray(matrix,1); 
adMatrix1=adMatrix1~=0; 
adMatrix1 = [0 0 1 
      0 0 0 
      1 0 0 
      0 1 0] 

然後:

adMatrix2 = accumarray(matrix+1,1); 
adMatrix2=adMatrix2~=0; 
adMatrix2 = [0 0 0 0 
      0 0 0 1 
      0 0 0 0 
      0 1 0 0 
      0 0 1 0] 

我知道,與「矩陣+ 1」,也就是零的一個額外的行和列,但我不明白爲什麼你會這樣做。當我查看它時,根據this後我應該使用「矩陣+ 1」,我得到的最好解釋是「因爲matlab中的索引從1開始」。

我完全不明白......如果我試圖創建一個鄰接矩陣,哪種方式是正確的?任何幫助將不勝感激,謝謝!

回答

3

如果您的節點ID爲0索引,則需要+1,否則您不需要。所以你需要問的問題是,你的節點ID爲0索引還是索引爲1?

+0

哦,我的nodeID的索引從1開始,那麼我認爲'accumarray(matrix,1)'應該是正確的,謝謝! – ocean800

1

您的矩陣是否接受多個鏈接?如果是,則上面的accumarray的結果都不正確,因爲節點1和3連接了2次。

順便說一句,你可以考慮sparsefull

full(sparse(matrix(:,1), matrix(:,2), ones(1, size(matrix, 1)))) 

ans = 

0  0  2 
0  0  0 
1  0  0 
0  1  0 

ones(1, size(matrix, 1))實際上是權重向量。

+1

感謝指出了多個鏈接,但是當我只調用'adMatrix1 = accumarray(matrix,1);'沒有'adMatrix1 = adMatrix1〜= 0'時''我得到一個具有多個鏈接的鄰接矩陣,我只是不希望那些顯示在最終矩陣中。另外,感謝「full」,「sparse」和「ones」的解釋! – ocean800

+1

對不起,我沒有注意到邏輯命令,只是看到了結果呵呵 – scmg