📄 f_jldtjl.m
字号:
function F_JlDtjl(R)%%定义函数
%%模糊聚类分析动态聚类
%%R模糊相似矩阵
[m,n]=size(R);%%获得矩阵的行列数
if(m~=n|m==0)return;end
for(i=1:n)R(i,i)=1;%%修正错误
for(j=i+1:n)
if(R(i,j)<0)R(i,j)=0;elseif (R(i,j)>1)R(i,j)=1;end
R(i,j)=round(10000*R(i,j))/10000;%%保留4位小数
R(j,i)=R(i,j);
end
end
js0=0;
while(1)%%求传递闭包
R1=Max_Min(R,R);js0=js0+1;
if(R1==R)break;else R=R1;end
end
lmd(1)=1;k=1;
for(i=1:n)for(j=i+1:n)pd=1;%%找出所有不相同的元素
for(x=1:k)if(R(i,j)==lmd(x))pd=0;break;end;end
if(pd)k=k+1;lmd(k)=R(i,j);end
end;end
for(i=1:k-1)for(j=i+1:k)if(lmd(i)<lmd(j))%%从大到小排序
x=lmd(j);lmd(j)=lmd(i);lmd(i)=x;
end;end;end
for(x=1:k)%%按lmd(x)分类,分类数为flsz(x),临时用Sz记录元素序号
js=0;flsz(x)=0;
for(i=1:n)pd=1;
for(y=1:js)if(Sz(y)==i)pd=0;break;end;end
if(pd)
for(j=1:n)if(R(i,j)>=lmd(x))js=js+1;Sz(js)=j;end;end
flsz(x)=flsz(x)+1;
end
end
end
for(i=1:k-1)for(j=i+1:k)if(flsz(j)==flsz(i))flsz(j)=0;end;end;end
fl=0;%排除相同的分类
for(i=1:k)if(flsz(i))fl=fl+1;lmd(fl)=lmd(i);end;end
for(i=1:n)xhsz(i)=i;end
for(x=1:fl)%%获得分类情况:对分类元素进行排序
js=0;flsz(x)=0;
for(i=1:n)pd=1;
for(y=1:js)if(Sz(y)==i)pd=0;break;end;end
if(pd)if(js==0)y=0;end
for(j=1:n)if(R(i,j)>=lmd(x))js=js+1;Sz(js)=j;end;end
flsz(x)=flsz(x)+1;
Sz0(flsz(x))=js-y;
end
end
js0=0;
for(i=1:flsz(x))
for(j=1:Sz0(i))Sz1(j)=Sz(js0+j);end
for(j=1:n)for(y=1:Sz0(i))if(xhsz(j)==Sz1(y))js0=js0+1;Sz(js0)=xhsz(j);end;end;end
end
for(i=1:n)xhsz(i)=Sz(i);end
end
for(x=1:fl)%%获得分类情况:每一子类的元素个数
js=0;flsz(x)=0;
for(i=1:n)pd=1;
for(y=1:js)if(Sz(y)==i)pd=0;break;end;end
if(pd)if(js==0)y=0;end
for(j=1:n)if(R(i,j)>=lmd(x))js=js+1;Sz(js)=j;end;end
flsz(x)=flsz(x)+1;Sz0(flsz(x))=js-y;
end
end
js0=1;
for(i=1:flsz(x))y=1;
for(j=1:flsz(x))
if(Sz(y)==xhsz(js0))flqksz(x,i)=Sz0(j);js0=js0+Sz0(j);break;end
y=y+Sz0(j);
end
end
end
F_dtjltx=figure('name','动态聚类图','color','w');
axis('off');
Kd=30;Gd=40;y=fl*Gd+Gd;lx=80;
text(24,y+Gd/2,'λ');
for(i=1:n)
text(lx-5+i*Kd-0.4*Kd*(xhsz(i)>9),y+Gd/2,int2str(xhsz(i)));
line([lx+i*Kd,lx+i*Kd],[y,y-Gd]);
linesz(i)=lx+i*Kd;
end
text(lx*1.5+i*Kd,y+Gd/2,'分类数');
y=y-Gd;
for(x=1:fl)
text(8,y-Gd/2,num2str(lmd(x)));
js0=1;js1=0;
if(x==1)
for(i=1:flsz(x))
js1=flqksz(x,i)-1;
if(js1)line([linesz(js0),linesz(js0+js1)],[y,y]);end
line([(linesz(js0+js1)+linesz(js0))/2,(linesz(js0+js1)+linesz(js0))/2],[y,y-Gd]);
linesz(i)=(linesz(js0+js1)+linesz(js0))/2;
js0=js0+js1+1;
end
else for(i=1:flsz(x))
js1=js1+flqksz(x,i)
js2=0;pd=0;
for(j=1:flsz(x-1))
js2=js2+flqksz(x-1,j);
if(js2==js1)pd=1;break;end
end
if(j~=js0)line([linesz(js0),linesz(j)],[y,y]);end
line([(linesz(js0)+linesz(j))/2,(linesz(js0)+linesz(j))/2],[y,y-Gd])
linesz(i)=(linesz(js0)+linesz(j))/2;
js0=j+1;
end;end
text(2*lx+n*Kd,y-Gd/3,int2str(flsz(x)));
y=y-Gd;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -