gusucode.com > 《模式识别与智能计算》matlab源代码 > 《模式识别与智能计算》matlab源代码/《模式识别与智能计算》部分函数的源程序/书程序/第2章/syscluster.m
function y=syscluster(x,t,type,distype) if nargin<4 distype='euclidean'; end r=size(x,1);patternum=r; for i=1:r patter(i).num=[i x(i,:)]; end switch type case 'single' while true mindis=inf; for i=1:patternum-1 for j=i+1:patternum d(i,j)=min(min(pattern_dis(patter(i).num(1:end,2:end),patter(j).num(1:end,2:end),distype))); if d(i,j)<mindis mindis=d(i,j);idex_i=i;idex_j=j; end end end if mindis<=t if idex_i>idex_j patter(idex_j).num=[patter(idex_j).num;patter(idex_i).num]; patter(idex_i).num=[];patternum=patternum-1; else patter(idex_i).num=[patter(idex_i).num;patter(idex_j).num]; patter(idex_j).num=[];patternum=patternum-1; end for i=1:r if i>patternum patter(i).num=[]; break elseif isempty(patter(i).num) patter(i).num=patter(i+1).num; patter(i+1).num=[]; end end else break end end case 'complete' while true mindis=inf; for i=1:patternum-1 for j=i+1:patternum d(i,j)=max(max(pattern_dis(patter(i).num(1:end,2:end),patter(j).num(1:end,2:end),distype))); if d(i,j)<mindis mindis=d(i,j);idex_i=i;idex_j=j; end end end if mindis<=t if idex_i>idex_j patter(idex_j).num=[patter(idex_j).num;patter(idex_i).num]; patter(idex_i).num=[];patternum=patternum-1; else patter(idex_i).num=[patter(idex_i).num;patter(idex_j).num]; patter(idex_j).num=[];patternum=patternum-1; end for i=1:r if i>patternum patter(i).num=[]; break elseif isempty(patter(i).num) patter(i).num=patter(i+1).num; patter(i+1).num=[]; end end else break end end case 'cen' d=squareform(pdist(x,distype)); while true mindis=inf; for i=1:patternum-1 for j=i+1:patternum if d(i,j)<mindis mindis=d(i,j);idex_i=i;idex_j=j; end end end i_num=0;j_num=0; if mindis<=t if idex_i>idex_j patter(idex_j).num=[patter(idex_j).num;patter(idex_i).num]; patter(idex_i).num=[];patternum=patternum-1; j_num=j_num+1; else patter(idex_i).num=[patter(idex_i).num;patter(idex_j).num]; patter(idex_j).num=[];patternum=patternum-1; i_num=i_num+1; end for i=1:r if i>patternum patter(i).num=[]; break elseif isempty(patter(i).num) patter(i).num=patter(i+1).num; patter(i+1).num=[]; end end temp_dis=d; for i=1:patternum-1 for j=i+1:patternum if (i<idex_i) if (j==idex_i) temp_dis(i,j)=sqrt((d(i,idex_i)^2*i_num+d(i,idex_j)^2*... j_num-d(idex_i,idex_j)^2*i_num*j_num)/(i_num+j_num)); elseif j>=idex_j temp_dis(i,j)=d(i,j+1); else temp_dis(i,j)=d(i,j); end elseif i==idex_i if j<idex_j temp_dis(i,j)=sqrt((d(idex_i,j)^2*i_num+d(idex_j,j)^2*... j_num-d(idex_i,idex_j)^2*i_num*j_num)/(i_num+j_num)); else temp_dis(i,j)=sqrt((d(idex_i,j+1)^2*i_num+d(idex_j,j+1)^2*... j_num-d(idex_i,idex_j)^2*i_num*j_num)/(i_num+j_num)); end elseif i>idex_i&&i<idex_j if j<idex_j temp_dis(i,j)=d(i,j); else temp_dis(i,j)=d(i,j+1); end else temp_dis(i,j)=d(i+1,j+1); end end end d=temp_dis; else break end end end for i=1:patternum r1=size(patter(i).num,1); for k=1:r1 y(patter(i).num(k,1))=i; end end