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

时间:2013-09-18 11:35:37

标签: 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]

我想找到每个节点的唯一后继者数量。我目前正在使用代码执行此操作,但它非常笨重;每次我更改矩阵时我都需要更改代码。它如下:

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));

有没有办法整理代码,只做一个更通用的代码!?

3 个答案:

答案 0 :(得分:0)

您可以使用D^1 + D^2 + D^3 + D^4 + D^5 + D^6 + D^7更改D*(D^size(D,1)-eye(size(D)))/(D-eye(size(D)))并使用.*~eye(size(D))摆脱对角线并以

结束
B=sum(logical(D*(D^size(D,1)-eye(size(D)))/(D-eye(size(D)))).*~eye(size(D)), 2)';

但是,我个人更喜欢你的代码。它更容易理解它在做什么。

答案 1 :(得分:0)

您可以更改

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

aux = (arrayfun(@(x) D^x, 1:length(D), 'UniformOutput',false));
D1 = any(cat(3,aux{:}),3);

适用于D的所有尺寸。

答案 2 :(得分:0)

这是一种直截了当的方式:

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);

也许是解释powers of the adjacency matrix的含义的链接。


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

% 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')

graph