[未答复] 索引超出范围该怎么修改呀

[复制链接]
昂热 发表于 2018-5-1 18:03:29
Patterns=[25 3589.12 18.2432 16.7856 116442.72 269 96.9372 13506.19267 38
4 4213.5 14.7675 16.0375 39522.04 31 92.635 11123.66 1
2 4851.5 13.9 16.31 9356.36 15 94.965 6361.35 0
4 4593.25 12.97 17.905 26134.15 43 98.0975 7343.7 0
3 3591.666667 13.62666667 18.46333333 9758.49 15 97.04666667 3966.8 0
2 4227 14.25 17.975 9016.59 8 96.75 8912.95 2
1 6270 15.78 13.05 4903.68 7 96.1 6097.25 0
2 5494 11.495 16.82 5919.35 9 95.955 2658.25 0
2 4781.5 10.76 17.225 7644.98 12 96.005 2228.7 0
1 6008 19.57 16.26  6860 8 97.12 7752.95 0
1 4517 14.3 19.58  3920.03 2 97.9 3152.25 0
1 900 7.74 13.24  770.88 2 97.99 1208.6 0
1 3300 12.32 17.10  1953.65 0 97.23 1683.6 0];
c=5;Nc=8;Selta_n=1;Selta_s=0.01;Selta_D=1;L=2;I=9;
Dim=size(Patterns,1);%模式维数
N=size(Patterns,2);%总的模式数目
bPartition=0;%分裂条件
bCombine=0;%合并条件
Classes=[];
%初始化聚类
for iPattern=1:Nc
    p=Classf(Patterns(:,iPattern));
    Classes=[Classes,p];
end
iStep=0;%迭代步数
while iStep<I
    %**************************************************************
    %按最小距离原则分类
   
    for iClass=1:Nc
        Classes(iClass)=empty(Classes(iClass));
    end
   
    for iPattern=1:N
        dMin=getDistance(Classes(1),Patterns(:,iPattern));%最小距离
        iClassMin=1;%最小距离对应之类别
        for iClass=2:length(Classes)
            d=getDistance(Classes(iClass),Patterns(:,iPattern));
            if dMin>d
                dMin=d;
                iClassMin=iClass;
            end
        end
        Classes(iClassMin)=addPattern(Classes(iClassMin),Patterns(:,iPattern));
    end
    %**************************************************************
   
    %**************************************************************
    %依Selta_n判断合并
    for iClass=1:length(Classes)
        if getSize(Classes(iClass))<Selta_n
            Classes(iClass)=[];
            bCombine=1;
            break;
        end
    end
   
    if bCombine==1
        Nc=Nc-1;
        break;
    end
    %**************************************************************
    %计算各类中模式到类心的平均距离
    d=[];
    d_mean=0.0;%总的平均距离
   
    for iClass=1:Nc
        d_tmp=getMeanDistance(Classes(iClass));%d_tmp当作临时变量
        d=[d,d_tmp];
        d_mean=d_mean+d_tmp*getSize(Classes(iClass));
    end
    d_mean=d_mean/N;
    %*************************************************************
   
    %*************************************************************
    if (iStep~=I)&&(Nc<=c/2||(Nc>c/2&&Nc<2*c&&(mod(iStep,2)==0)))
        %**********************************************************
        %分裂处理
        for iClass=1:Nc
            delta=getStdVector(Classes(iClass));
            [delta_max,index]=max(delta);
            if (delta_max>Selta_s)&&((d(iClass)>d_mean&&getSize(Classes(iClass))>2*(Selta_n+1))||Nc<=c/2)
                bPartition=1;
                break;
            end
        end
    end
   
    %分裂
    k=0.5;
    if 1==bPartition
        centerPattern=getCenter(Classes(iClass));
        Classes(iClass)=[];
        Nc=Nc+1;
        centerPatternPlus=centerPattern;
        centerPatternPlus(index)=centerPattern(index)+k*delta_max;
        centerPatternMinus=centerPattern;
        centerPatternMinus(index)=centerPattern(index)-k*delta_max;
        p=Classf(centerPatternPlus);
        Classes=[Classes,p];
        p=Classf(centerPatternMinus);
        Classes=[Classes,p];
        iStep=iStep+1;
        continue;
    end
   
    %*************************************************************
    %合并处理
    if iStep==I
        Selta_D=0;
    end
   
    %计算各类对中心间的距离
    d=getDistance(Classes(1),getCenter(Classes(2)));
    i=1;
    j=2;
    for iClass=1:Nc-1
        for jClass=iClass+1:Nc
           d_ij=getDistance(Classes(iClass),getCenter(Classes(jClass)));
           if d>d_ij
              d=d_ij;
              i=iClass;
              j=jClass;
           end
               
        end
    end
   
    %合并
    if d_ij>Selta_D
        iStep=iStep+1;
    end
   
    iCenter=getCenter(Classes(i));
    jCenter=getCenter(Classes(j));
   
    Ni=getSize(Classes(i));
    Nj=getSize(Classes(j));
   
    newCenter=(iCenter*Ni+jCenter*Nj)/(Ni+Nj);
    Classes(i)=[];
    Classes(j)=[];
    p=Classf(newCenter);
    Classes=[Classes,p];
    Nc=Nc-1;
    iStep=iStep+1;      
   
end

1.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表