MATLAB中获取图连通分量节点索引及两图指定分量节点对比
解决邻接矩阵连通分量节点重合统计问题
首先,咱们一步步来解决你的问题——先搞定你当前卡壳的「获取图B中节点数>5的连通分量索引」,再完整实现三类节点数量的统计:
第一步:定位图B中目标连通分量的节点
你已经用conncomp拿到了Bbins(每个节点对应的连通分量标签)、Cb(唯一的分量标签)和Cb_counts(每个分量的节点数)。现在只需筛选出节点数>5的分量标签,再找到对应节点:
% 找到图B中节点数大于5的连通分量标签(也就是你说的大小为7的分量) target_B_label = Cb(Cb_counts > 5); % 获取该分量下的所有节点索引 nodes_B7 = find(Bbins == target_B_label);
第二步:定位图A中目标连通分量的节点
接下来要提取图A中大小为5、6的连通分量节点集合:
% 计算图A每个连通分量的节点数 Ca_counts = accumarray(ica, 1); % 筛选出大小为5和6的分量标签 target_A_labels = Ca(ismember(Ca_counts, [5,6])); % 获取这两个分量下的所有节点索引 nodes_A56 = find(ismember(Abins, target_A_labels));
第三步:统计三类节点数量
有了nodes_A56和nodes_B7两个节点集合,直接用MATLAB的集合运算就能得到你要的三类数量:
% 1. 图A的5、6分量与图B的7分量的共同节点数 count1 = length(intersect(nodes_A56, nodes_B7)); % 2. 不在图A的5、6分量中,但属于图B的7分量的节点数 count2 = length(setdiff(nodes_B7, nodes_A56)); % 3. 属于图A的5、6分量,但不在图B的7分量中的节点数 count3 = length(setdiff(nodes_A56, nodes_B7));
完整可运行代码
把所有步骤整合起来,替换掉你的邻接矩阵输入就能直接用:
% 替换成你的邻接矩阵 % A = ...; % B = ...; Abins = conncomp(graph(A)); Bbins = conncomp(graph(B)); % 处理图A的目标连通分量 [Ca, iaa, ica] = unique(Abins); Ca_counts = accumarray(ica, 1); target_A_labels = Ca(ismember(Ca_counts, [5,6])); nodes_A56 = find(ismember(Abins, target_A_labels)); % 处理图B的目标连通分量 [Cb, iab, icb] = unique(Bbins); Cb_counts = accumarray(icb,1); target_B_label = Cb(Cb_counts > 5); nodes_B7 = find(Bbins == target_B_label); % 统计并输出结果 count1 = length(intersect(nodes_A56, nodes_B7)); count2 = length(setdiff(nodes_B7, nodes_A56)); count3 = length(setdiff(nodes_A56, nodes_B7)); fprintf('共同节点数:%d\n', count1); fprintf('属于B的7分量但不属于A的5/6分量的节点数:%d\n', count2); fprintf('属于A的5/6分量但不属于B的7分量的节点数:%d\n', count3);
内容的提问来源于stack exchange,提问作者Shew
相关产品推荐
相关产品推荐

