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

コードを整理して、より一般的なコードを作成する方法はありますか!?

4

3 に答える 3

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

于 2013-09-18T12:48:26.960 に答える
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);

おそらく、隣接行列の力の意味を説明するリンクです。


次のコードを使用して、結果のグラフを視覚化できます (プロットは有向エッジと無向エッジを区別しないことに注意してください)。

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

グラフ

于 2013-09-18T12:51:23.890 に答える