Matlab 矩阵中链接元素的块数

Matlab 矩阵中链接元素的块数,matlab,Matlab,如何在Matlab中使用0和1的对称矩阵来计算分离链接块的数量 例如,在矩阵A中,如果A(n,m)=1,则成员n和m是连接的。连接的元素构成块。在下面的矩阵中,将成员2、3、4、5、6、8、9连接起来,形成一个块。此外,还有两个大小等于2的簇和一个大小为7的块 A = [1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1

如何在Matlab中使用0和1的对称矩阵来计算分离链接块的数量

例如,在矩阵A中,如果A(n,m)=1,则成员n和m是连接的。连接的元素构成块。在下面的矩阵中,将成员2、3、4、5、6、8、9连接起来,形成一个块。此外,还有两个大小等于2的簇和一个大小为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]

在前面的问题()之后,您可以使用标签代替二进制指示,然后sqrt每个块中的成员数:

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

在前面的问题()之后,您可以使用标签代替二进制指示,然后sqrt每个块中的成员数:

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

请看我添加到问题中的代码。我试着在我的例子中使用你的答案,但在一般情况下它不起作用,你显然需要使用
B=double(A | diag(one(1,size(A,1)));%每个节点都与自身连接
。但除此之外,这个特殊的A没有两个块(大小为2和7),只有一个块(大小为7)。我的意思是,只有一个簇-2,3,4,5,6,8,9-只构成一个块(大小为7,作为这个连接/图中的成员数)。或者我不明白你的“阻止”的意思。请看我在问题中添加的代码。我试着在我的例子中使用你的答案,但在一般情况下它不起作用,你显然需要使用
B=double(A | diag(one(1,size(A,1)));%每个节点都与自身连接
。但除此之外,这个特殊的A没有两个块(大小为2和7),只有一个块(大小为7)。我的意思是,只有一个簇-2,3,4,5,6,8,9-只构成一个块(大小为7,作为这个连接/图中的成员数)。或者我不明白你说的“阻塞”是什么意思。