2013-09-18 4 views
0

Я новичок в программном обеспечении MATLAB, и в настоящее время я пытаюсь изучить его, не будучи формально преподаваемым и иметь довольно простой вопрос.MATLAB: поиск числа уникальных преемников каждого узла из матрицы

У меня есть матрица смежности, которая соответствует орграфу, и вы хотите увидеть, какие узлы связаны путем ходьбы с другими узлами в сети. Таким образом, учитывая матрицу смежности с п узлами:

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

Есть ли способ, чтобы привести в порядок код и просто сделать более общий !?

+0

выглядит как мы редактировали друг другой :) – Amro

+0

@Amro О да, мы сделали, ха-ха! Я только что отправил вам электронное письмо с благодарностью, надеюсь, что у вас это получилось! – Owen

+0

оценил, я рад, что смогу помочь! – Amro

ответ

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

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

Тем не менее, я лично предпочитаю код. Легче понять, что он делает.

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.

Смежные вопросы