我有一个带有有向边的邻接矩阵。计算A ^ 3,将帮助我检测矩阵中是否存在长度为3(三角形)的任何循环。但是,我想知道哪些节点形成三角形。我怎样才能在Matlab中实现这一目标?
谢谢
答案 0 :(得分:3)
矩阵乘法的问题在于将所有行加起来。当矩阵P
的第一行乘以矩阵Q
的第一列时,它会进行逐元素乘法,然后生成结果向量的总和,丢弃所有关于中间节点。好吧,我们想要那个向量,所以让我们阻止它添加它们。
假设我们有邻接矩阵A
:
A =
0 1 0 0 0
0 0 1 0 0
1 0 0 1 0
0 0 0 0 0
0 0 0 1 0
我们想知道从节点x
到节点z
是否有通过节点y
的路径(不是周期)。行x
告诉我们哪些节点具有从x
到y
的边缘,而列z
告诉我们哪些节点具有从y
到z
的边缘。如果我们执行行AND
和列x
的元素z
,我们应该得到连接到{{1}的所有节点y
的向量}和x
。
例如,如果我们为此邻接矩阵z
行AND
和列1
:
3
我们看到它们是由节点A =
0 1 0 0 0
x x 1 x x
x x 0 x x
x x 0 x x
x x 0 x x
>> A(1,:) & A(:,3).' %// remember to transpose the column first...
ans =
0 1 0 0 0
连接的。太棒了,现在我们知道在这种情况下我们有一条路径2
。一般来说,从1->2->3
到1
可能有多条路径,因此我们将使用整个向量。
现在我们要做的就是确保从节点3
返回到节点3
的路径。好吧,那是我们的邻接矩阵中的行1
,列3
。如果我们使用向量1
AND
,如果有A(3,1)
到3
的边,我们应该返回相同的向量,如果没有,则返回零(因此,没有循环)。
1
对此进行概括,从>> (A(1,:) & A(:,3).') & A(3,1)
ans =
0 1 0 0 0
到x
的每条路径的向量是
z
不幸的是我一直无法找到一种方法来对此进行矢量化,因此双C(x,:,z) = (A(x,:) & A(:,z).') & A(z,x);
循环现在已经足够了:
for
如果存在从for x = 1:size(A,1)
for z = 1:size(A,2)
C(x,:,z) = (A(x,:) & A(:,z).') & A(z,x);
end
end
到C(x,y,z) = 1
到x
(并且返回)的周期,则生成的矩阵将为y
,否则为z
。请注意,每个周期将列出3次:
0