我有一个双分图(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后,我也要删除它们的邻接列表。
答案 0 :(得分:1)
这很简单。使用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