2015-07-10 84 views

回答

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。如果我们执行行x的元素明智AND和列z,我们应该得到连接到xz的所有节点y的向量。

例如,如果我们AND1并为此邻接矩阵列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。一般来说,从13可能有多条路径,所以我们要使用整个向量。

现在我们所要做的就是确保从节点3到节点1有一条路径。那么,我们的邻接矩阵中的行3,列1。如果我们ANDA(3,1)与我们的向量,我们应该回到相同的向量,如果有从31的边缘,并且如果没有(并因此没有循环)则返回零。

>> (A(1,:) & A(:,3).') & A(3,1) 
ans = 

    0 1 0 0 0 

归纳这一点,从xz每个路径矢量是

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如果存在来自一个周期至yz(和返回)以及0。请注意,每个周期将列出3次:

C(x,y,z) == C(y,z,x) == C(z,x,y) 
+0

非常感谢。该解决方案就像一个冠军。 为了避免循环被列出3次,我从'x + 1'循环了'z',从而忽略了像1-> 1-> 1这样的自循环。 '对于z = x + 1:size(A,2)' –

+0

@SeemaKumar这会工作,我只是不知道你是否想要所有3个排列或不。如果您对解决方案感到满意,请考虑接受答案。 – beaker

相关问题