使用MATLAB在图形中查找邻居的邻居

时间:2015-03-03 21:04:33

标签: matlab matrix graph-theory

我有一个矩阵A,代表一个邻居关系。

A=[1 2
   1 4
   2 6
   4 5
   6 7
   6 8]

A的行已排序,表示[1 2][2 1]被视为相同的邻居关系,A的行按升序词典顺序排序。< / p>

在我们的示例矩阵中,节点1是节点24的邻居,节点26的邻居,节点{{ 1}}是4的邻居,依此类推。我想计算表示邻居(NON)关系的邻居的矩阵5。如果两个节点都有一些节点,它们都是它们的邻居,则两个节点是彼此的NON。这意味着B不是1(通过5)和4(通过6)等等。

2

如何计算矩阵 B=[1 5 1 6 2 4 2 7 2 8 7 8]

1 个答案:

答案 0 :(得分:4)

让我们调用您的图表G。您可以使用G的{​​{1}} G^k计算k=2邻居的邻居,这是具有相同节点但其中两个顶点相邻的图形当他们在G的距离最多为k时。

您可以阅读维基百科文章的详细信息,但最重要的部分是:

  

如果A是图表的邻接矩阵,则修改为非零   在其主对角线上的条目,然后A^k的非零条目给出   图的k次幂的邻接矩阵。

(对于我们的情况k=2,我们不需要对角线上的非零条目,因为我们需要距离恰好是两个而不是距离小于或等于到两个,这将对角线设置为非零条目适用于。)

因此,您只需通过以下方式构建邻接矩阵A

edges = A;
n = max(edges(:));
A = sparse(edges(:,1),edges(:,2),1,n,n) + ...
    sparse(edges(:,2),edges(:,1),1,n,n); % Make graph undirected via symmetry.

然后,您将通过G^2A*A生成A^2的邻接矩阵,然后使用find来获取边缘:

[I,J] = find(A^2); % Edges of A^2

然后您可以通过删除那里不需要的元素(如原始连接或自连接)来构建B

B = setdiff(sort([I,J],2), [edges; [(1:n).',(1:n).'], 'rows')