📄 c_zhongxin.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 + -