繁体   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