资源简介
通过MATLAB实现了最小生成树算法中的Kruskal算法,而且可以通过设置阈值进行聚类(包含数据集哟)
代码片段和文件信息
clear all;
%===============================================
%导入数据集并初始化中间变量
% pointdata = load(‘mydataset.txt‘)‘;
pointdata=load(‘rings1.txt‘);
pointdata(:length(pointdata(1:)))=[];
distarr=pdist(pointdata ‘euclidean‘);
save=squareform(distarr);%得到图的距离(权值)矩阵
len=length(save(:1));
edge=[];%记录连接的边
%cc存储了连通分支,初始状态设每个点为连通分支
cc=cell(1len);
for i=1:len
cc{i}=i;
end
%=================================================
%生成最小生成树,并按照阈值分割最小生成树,得到几个连通分支
threshold=0.6;%设置阈值
ccSize=size(cc);
while ccSize(2)>1
%得到最小的权值的边
minpx=Inf;
for i=1:1:len
for j=i+1:1:len
if save(ij) dot=[ij];
minpx=save(ij);
end
end
end
%判断阈值
if minpx>threshold
break;
end
%======================================
%核心算法步骤:
%判断上面得到的边上的两点是否在不同的连通分支上;
%若在不同的连通分支,则将这两个连通分支合并为一个连通分支,即把边加入edge矩阵中;
%若在同一连通分支则退出循环,继续下一步,即忽略这条边
%======================================
ccSize=size(cc);
flag1=0;
flag2=0;
for i=1:ccSize(2)
if ismember(dot(1)cc{i})
flag1=1;
m=i;
end
if ismember(dot(2)cc{i})
flag2=1;
n=i;
end
if flag1&&flag2
a=min(mn);
b=max(mn);
%判断是否在同一连通分支
if m==n
break;
else
%合并连通分支,并记录边的过程
cc{ccSize(2)+1}=[cc{m}cc{n}];
cc(:a)=[];
cc(:b-1)=[];
edge=[edge;dot(1)dot(2)];
end
break;
end
end
%使读过的最小的边失效,不在被读取
save(dot(1)dot(2))=Inf;
save(dot(2)dot(1))=Inf;
end
%==================================================
%作最小生成树的图
for i=1:length(edge(:1))
plot([pointdata(edge(i1)1)pointdata(edge(i2)1)][pointdata(edge(i1)2)pointdata(edge(i2)2)]‘-go‘);
hold on;
end
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2227 2017-12-21 22:43 Kruskul.m
文件 40 2017-12-11 14:36 myTestDataset.txt
文件 7525 2014-06-16 15:44 rings.txt
文件 7525 2017-12-05 16:31 ringsDisorder.txt
- 上一篇:自动门西门子S7-200PLC程序
- 下一篇:图像对比度计算MATLAB代码
评论
共有 条评论