使用MATLAB构建无向图邻接矩阵遇重复边错误的求助
解决MATLAB构建无向图邻接矩阵的重复边错误
问题根源
MATLAB的graph函数构建无向图时,会将(u,v)和(v,u)视为同一条重复边,但直接用unique(data,'rows')无法检测到这类镜像边——因为它们的行顺序不同。你之前查找镜像行的代码逻辑错误,导致整个矩阵被清空。
解决方案:标准化边后去重
核心思路是先将每条边的两个节点按从小到大排序,让镜像边变成完全相同的行,再进行去重操作,最后构建图和邻接矩阵。
具体代码
% 对每一行的节点进行排序,确保每条边的第一个节点 ≤ 第二个节点 data_sorted = sort(data, 2); % 去除重复的边(包括原有的重复行和镜像行) unique_edges = unique(data_sorted, 'rows'); % 构建无向图对象 G = graph(unique_edges(:,1), unique_edges(:,2)); % 获取邻接矩阵 A = adjacency(G);
为什么之前的方法失效?
unique(data,'rows')无法检测镜像边:该函数只会识别完全相同的行,而无向图中(u,v)和(v,u)属于同一条边,但行内容不同,因此无法被检测到。- 镜像行查找代码逻辑错误:
ismember(data, fliplr(data),'rows')会将所有行匹配到自身的镜像(比如[1,2]会匹配到fliplr(data)中的[2,1],反之亦然),导致所有行都被标记为镜像行并删除,最终矩阵被清空。
内容的提问来源于stack exchange,提问作者AMGEO
相关产品推荐
相关产品推荐

