⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_jldtjl.m

📁 模糊聚类分析方法的matlab程序
💻 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 + -