[英]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.