簡體   English   中英

Matlab中圖的鄰接列表

[英]Adjacency lists of a graph in matlab

我有一個二部圖(A,B)的鄰接矩陣,如下所示。

A = [1 0 0; 0 1 0; 1 1 1; 0 0 1; 0 1 1; 1 1 0];

我想為圖創建一個鄰接列表,即像這樣的列表[1,2,{1,2,3},3,{2,3},{1,2}]。 如何在Matlab中做到這一點?

我也想找到度為1的節點,即在我們的情況下,集合A中的節點1,2,4是因為它們分別連接到另一個集合B的節點1,2,3。 找到節點1,2,4之后,我還要刪除它們的鄰接表。

那很容易。 使用find命令查找所有非零的行和列值,然后可以通過簡單地調用accumarray來放置每個源節點所涉及的節點。 像這樣:

A= [ 1 0 0; 0 1 0; 1 1 1;0 0 1;0 1 1;1 1 0];
[R,C] = find(A);
lst = accumarray(R, C, [], @(x) {sort(x)});

請記住,節點將不排序,因此您需要在完成后對它們進行排序。 lst是一個單元格數組,其中每個值都向您提供該值所索引的事件節點。

我們得到這個:

>> format compact;
>> celldisp(lst)
lst{1} =
     1
lst{2} =
     2
lst{3} =
     1
     2
     3
lst{4} =
     3
lst{5} =
     2
     3
lst{6} =
     1
     2

要訪問特定節點,只需執行lst{i} ,其中i是您想要的節點。

如果要查找度數為1的所有節點,只需執行以下操作:

degrees = cellfun(@numel, lst);

這將遍歷每個列表並計算出每個源節點上有多少個節點入射:

>> degrees
degrees =
     1
     1
     3
     1
     2
     2

如果要刪除任何度數為1的值的鄰接表,只需索引到單元格數組中,然后查找不具有度數1的值:

lst2 = lst(degrees ~= 1);

我們得到:

>> celldisp(lst2)
lst2{1} =
     1
     2
     3
lst2{2} =
     2
     3
lst2{3} =
     1
     2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM