2017-03-24 7 views
1

Matlabで対称行列0と1を使用して分離されたリンクブロックの数を見つける方法はありますか?行列内のリンクされた要素のブロック数

たとえば、行列Aでは、A(n、m)= 1の場合、メンバnとmが接続されます。接続された要素はブロックを作成します。以下の行列では、メンバー2,3,4,5,6,8,9が接続されてブロックされています。また、あなたの前の質問(link)あなたの代わりにバイナリ指示の、その後、各ブロック内のメンバーの数はsqrtラベルを使用することができ、次の2に等しいサイズの2つのクラスタと1つのサイズのブロック7

A = [1  0  0  0  0  0  0  0  0  0   
    0  1  1  1  1  1  0  1  1  0 
    0  1  1  1  1  1  0  1  1  0 
    0  1  1  1  1  1  0  1  1  0 
    0  1  1  1  1  1  0  1  1  0 
    0  1  1  1  1  1  0  1  1  0 
    0  0  0  0  0  0  1  0  0  0 
    0  1  1  1  1  1  0  1  1  0 
    0  1  1  1  1  1  0  1  1  0 
    0  0  0  0  0  0  0  0  0  1] 

答えて

0

があります:

A = false(10); 
% direct connections 
A(2,3) = 1; 
A(3,4) = 1; 
A(5,6) = 1; 
A(4,9) = 1; 
A = A | A'; 
B = double(A | diag(ones(1,10))); % each node is connected to it self 
B(B == 1) = 1:nnz(B); % set initial unique labels 
while true 
    B_old = B; 
    % connect indirect connected nodes 
    for node = 1:size(B,1) 
     row = B(node,:); 
     col = row'; 
     row = row > 0; 
     col(col > 0) = max(col); 
     cols = repmat(col,[1 nnz(row)]); 
     % set the same label for each group of connected nodes 
     B(:,row) = max(B(:,row) , cols); 
    end 
    if isequal(B,B_old) 
     break 
    end 
end 
% get block size 
u = unique(B); 
counts = hist(B(:),u); 
% remove non connections 
counts(u == 0) = []; 
u(u == 0) = []; 
% remove self connections 
u(counts == 1) = []; 
counts(counts == 1) = []; 
% block size 
blocksize = sqrt(counts); 
+0

質問に追加したコードを見てください。私はあなたの答えを私の場合に使用しようとしましたが、一般的に 'B = double(A | diag(ones、1、size(A、1))))));)を使用する必要があるので、 –

+0

は動作しません。 %ノードはそれ自身に接続されています。しかし、それ以外のこの特定のAは2つのブロック(サイズ2と7)を持たず、1つ(サイズ7のブロック)しか持たない。つまり、1つのクラスタ(2,3,4,5,6,8,9)は1ブロックしかありません(この接続/グラフのメンバー数は7です)。あるいは、私はあなたの "ブロック"の意味を理解していないかもしれません。 – user2999345

関連する問題