MATLAB:从矩阵中找到每个节点的唯一后继数

MATLAB:从矩阵中找到每个节点的唯一后继数,matlab,graph-theory,adjacency-matrix,Matlab,Graph Theory,Adjacency Matrix,我是MATLAB软件的新手,目前正在尝试在没有正式教授的情况下学习它,并且有一个非常简单的问题 我有一个邻接矩阵,它对应于一个有向图,我想看看哪些节点通过漫游连接到网络中的其他节点。因此,给定一个具有n个节点的邻接矩阵: D = [0,1,1,0,0,0,0; 0,0,0,1,1,0,0; 0,0,0,0,1,0,0; 0,0,0,0,0,1,0; 0,0,0,0,0,1,0; 0,0,0,0,0,0,1; 0,0,0,0,0,0,0]

我是MATLAB软件的新手,目前正在尝试在没有正式教授的情况下学习它,并且有一个非常简单的问题

我有一个邻接矩阵,它对应于一个有向图,我想看看哪些节点通过漫游连接到网络中的其他节点。因此,给定一个具有n个节点的邻接矩阵:

D = [0,1,1,0,0,0,0;
     0,0,0,1,1,0,0;
     0,0,0,0,1,0,0;
     0,0,0,0,0,1,0;
     0,0,0,0,0,1,0;
     0,0,0,0,0,0,1;
     0,0,0,0,0,0,0]
我想找到每个节点的唯一继承者的数量。我目前正在使用一个代码来实现这一点,但它非常笨拙;每次我更改矩阵时,我都需要更改代码。详情如下:

D1 = logical(D^1 + D^2 + D^3 + D^4 + D^5 + D^6 + D^7);

D1(logical(eye(size(D1)))) = 0;

B = sum(transpose(D1));

有没有办法整理一下代码,让它变得更一般

你可以用
D*(D^size(D,1)-眼(size(D))/(D-eye(size(D)))
改变
D^1+D^2+D^3+D^4+D^5+D^6+D^7
,然后用
*~眼(size(D))
去掉对角线,最后得到

B=sum(logical(D*(D^size(D,1)-eye(size(D)))/(D-eye(size(D)))).*~eye(size(D)), 2)';
然而,我个人更喜欢你的代码。更容易理解它在做什么。

您可以更改

D1 = logical(D^1 + D^2 + D^3 + D^4 + D^5 + D^6 + D^7);


这适用于所有尺寸的
D

以下是一种简单的方法:

N = length(D);
DD = zeros(N);
for i=1:N
    DD = DD + D^i;
end
DD = logical(DD);
DD(1:N+1:end) = false;
B = sum(DD,2);
也许是一个链接来解释的意思


可以使用以下代码可视化生成的图形(请注意,绘图不区分有向/无向边):


看起来我们在互相编辑:)@Amro哦,是的,我们编辑了,哈哈!我刚刚给你发了一封感谢信,希望你能收到!!谢谢,我很高兴能帮上忙!
N = length(D);
DD = zeros(N);
for i=1:N
    DD = DD + D^i;
end
DD = logical(DD);
DD(1:N+1:end) = false;
B = sum(DD,2);
% circular layout
t = linspace(0,2*pi,N+1)'; t(end) = [];
xy = [cos(t) sin(t)];

% plot graph and label nodes
subplot(121), gplot(DD, xy, '-*')
text(xy(:,1), xy(:,2), num2str((1:N)'), 'BackgroundColor',[.4 .9 .5], ...
    'VerticalAlign','bottom', 'HorizontalAlign','right')
axis square off

% adjacency matrix
subplot(122), spy(DD)
set(gca, 'XTick',1:N, 'YTick',1:N)
ylabel('from'), xlabel('to')