在邻接矩阵中形成循环的节点(Matlab)

时间:2015-07-10 15:02:57

标签: matlab matrix matrix-multiplication adjacency-matrix

我有一个带有有向边的邻接矩阵。计算A ^ 3,将帮助我检测矩阵中是否存在长度为3(三角形)的任何循环。但是,我想知道哪些节点形成三角形。我怎样才能在Matlab中实现这一目标?

谢谢

1 个答案:

答案 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告诉我们哪些节点具有从xy的边缘,而列z告诉我们哪些节点具有从yz的边缘。如果我们执行行AND和列x的元素z,我们应该得到连接到{{1}的所有节点y的向量}和x

例如,如果我们为此邻接矩阵zAND和列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->31可能有多条路径,因此我们将使用整个向量。

现在我们要做的就是确保从节点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) = 1x(并且返回)的周期,则生成的矩阵将为y,否则为z。请注意,每个周期将列出3次:

0