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

📄 pri_divide.m

📁 有序样品的最优分割程序。本程序优点在于分类齐全
💻 M
字号:
%========================================%
%*          有序样品的最优二、三分割        *%
%========================================%
% n_way(取0或1)表示计算距离的不同方法;
% n_2_3(取2或3) 表示二分割或者三分割
function pri_divide(x,n_way,n_2_3)
%
% Author:
%  Zhang Heng-lei 25-Dec-2006.
%  Last Revision: 25-Dec-2006.
%  Institude of Geophysics and Geomatics, China Univercity of Geosciensis.
% Email:sky0610@163.com
%求x内样品间的极差矩阵D
LL=length(x);
D=zeros(LL);
if n_way==0
    for i=1:LL-1
        for j=i+1:LL
            D(i,j)=max(x(i:j))-min(x(i:j));
        end
    end
    fprintf('采用段内极差的');
elseif n_way==1
       for i=1:LL-1
            dd=0;
        for j=i+1:LL
            ddd=sum(x(i:j))/(j-i+1);
            for k=i:j
                dd=dd+(x(k)-ddd)^2;
            end
             D(i,j)=dd;
        end
    end
    fprintf('采用段内离差和的');
else
    fprintf('输入错误!');
end
%=================
%选择不同的分割方法
%=================
if  n_2_3==2
    s=ones(LL-1,1)*999;
    for i=1:LL-1
        s(i)=D(1,i)+D(i+1,LL);
    end
    mi=min(s);
    ss=s;
    for i=1:LL-2
        if s(i)==mi
            T_2=i;
            fprintf('最优二分割结果如下:');
            fprintf('最优二分割的分割点为 %d\n',i);
            x1=x(1:T_2);x2=x(T_2+1:LL);
            fprintf('%c','x1={');fprintf(' %g',x1);fprintf('%c','}');
            fprintf('\n');
            fprintf('%c','x2={');fprintf(' %g',x2);fprintf('%c','}');  
            fprintf('\n');
        end
    end
      
    
elseif n_2_3==3

 s=ones(LL-2,LL-1)*999;%s的行存放第一分割点(最大LL-2),列存放第二分割点(最大-1),且从第二列开始
%------  1  --------%
%1、固定第二分割点,求得各种第一分割点
%for i=5:-1:2
 for i=LL-1:-1:2
    for k=1:i-1
        s(k,i)=D(1,k)+D(k+1,i);
    end
end
%-----  2  --------%
%2、分析各种三分割情况下的最小总离差和
k=1;
for j=2:LL-1
    mi=min(s(:,j));
    for i=1:j-1
        if s(i,j)==mi
            D_point(k,1)=i;
            D_point(k,2)=j;
            k=k+1;
        end
    end
end
 
for n=1:k-1
    i=D_point(n,1);
    j=D_point(n,2);
    %temp=s(i,j)+D(j+1,6);
     temp=s(i,j)+D(j+1,LL);
    ss(n,1)=temp;
    ss(n,2)=i;
    ss(n,3)=j;
end
%寻找最小的总离差和
mi=min(ss(:,1));
for i=1:k-1
   if ss(i,1)==mi
        first_point=ss(i,2);
        Two_ponit=ss(i,3);
        x1=x(1:first_point);x2=x(first_point+1:Two_ponit);x3=x(Two_ponit+1:LL);
        fprintf('最优三分割结果如下:');
        fprintf('第一分割点为 %d',first_point);
        fprintf(';第二分割点为 %d\n',Two_ponit);
            fprintf('%c','x1={');fprintf(' %g',x1);fprintf('%c','}');
            fprintf('\n');
            fprintf('%c','x2={');fprintf(' %g',x2);fprintf('%c','}');  
            fprintf('\n');
            fprintf('%c','x3={');fprintf(' %g',x3);fprintf('%c','}');  
            fprintf('\n');        
    end
end    


else
    fprintf('输入错误!');
end

⌨️ 快捷键说明

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