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