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

📄 c_zhongxin.m

📁 用matlab实现聚类算法
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 函数名称:C_ ZhongXin()
% 参数:m_pattern:样品特征库;patternNum:样品数目
% 返回值:m_pattern:样品特征库
% 函数功能:按照重心法对全体样本进行分类
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [m_pattern]=C_ZhongXin(m_pattern,patternNum)
    disType=DisSelDlg(); %获得距离计算类型
    T=InputThreshDlg(m_pattern,patternNum,disType); %获得阈值
    %初始化,所有样品各分一类
    for i=1:patternNum
        m_pattern(i).category=i;
    end
    centerNum=patternNum;
    
    %建立类间距离数组,centerdistance(i,j)表示i类和j类距离
    centerdistance=zeros(centerNum,centerNum);
    for i=1:patternNum-1
        for j=i+1:patternNum
            centerdistance(i,j)=GetDistance(m_pattern(i),m_pattern(j),disType);
        end
    end
 
    while(true)
        td=inf;
        for i=1:centerNum-1
            for j=i+1:centerNum
                if(td>centerdistance(i,j))
                    td=centerdistance(i,j); %找到距离最近的两类:ti,tj,记录最小距离td;
                    ti=i;
                    tj=j;
                end
            end
        end
        numi=0;
        numj=0;
        if(td<T) %合并i,j
            for i=1:patternNum
                if(m_pattern(i).category==ti)
                    numi=numi+1;
                elseif(m_pattern(i).category==tj)
                     m_pattern(i).category=ti;
                     numj=numj+1;
                elseif(m_pattern(i).category>tj)
                    m_pattern(i).category=m_pattern(i).category-1;
                end
            end
            centerNum=centerNum-1;
            tempDistance=centerdistance;
            
            for i=1:centerNum-1 %重新计算合并后的类到其他各类的新距离
                for j=i+1:centerNum
                    if(i<ti)
                        if(j==ti)
                            tempDistance(i,j)=sqrt(centerdistance(i,ti)*centerdistance(i,ti)*numi/(numi+numj)+centerdistance(i,tj)*centerdistance(i,tj)*numi/(numi+numj)-centerdistance(ti,tj)*centerdistance(ti,tj)*numi*numj/(numi+numj));
                        elseif(j>=tj)
                            tempDistance(i,j)=centerdistance(i,j+1);
                        else
                            tempDistance(i,j)=centerdistance(i,j);
                        end
                    elseif(i==ti)
                        if(j<tj)
                            tempDistance(i,j)=sqrt(centerdistance(ti,j)*centerdistance(ti,j)*numi/(numi+numj)+centerdistance(j,tj)*centerdistance(j,tj)*numj/(numi+numj)-centerdistance(ti,tj)*centerdistance(ti,tj)*numi*numj/(numi+numj));
                        else
                             tempDistance(i,j)=sqrt(centerdistance(ti,j+1)*centerdistance(ti,j+1)*numi/(numi+numj)+centerdistance(tj,j+1)*centerdistance(tj,j+1)*numj/(numi+numj)-centerdistance(ti,tj)*centerdistance(ti,tj)*numi*numj/(numi+numj));
                        end
                    elseif((i>ti)&&(i<tj))
                        if(j<tj)
                            tempDistance(i,j)=centerdistance(i,j);
                        else
                            tempDistance(i,j)=centerdistance(i,j+1);
                        end
                    else
                            tempDistance(i,j)=tempDistance(i+1,j+1);
                    end
                end
            end
            
            centerdistance=tempDistance;
        else
            break;
        end
    end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -