我有一个矩阵A
,代表一个邻居关系。
A=[1 2
1 4
2 6
4 5
6 7
6 8]
A
的行已排序,表示[1 2]
和[2 1]
被视为相同的邻居关系,A
的行按升序词典顺序排序。< / p>
在我们的示例矩阵中,节点1
是节点2
和4
的邻居,节点2
是6
的邻居,节点{{ 1}}是4
的邻居,依此类推。我想计算表示邻居(NON)关系的邻居的矩阵5
。如果两个节点都有一些节点,它们都是它们的邻居,则两个节点是彼此的NON。这意味着B
不是1
(通过5
)和4
(通过6
)等等。
2
如何计算矩阵 B=[1 5
1 6
2 4
2 7
2 8
7 8]
?
答案 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^2
或A*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')