function[op]=Class1D_Plus(num1D,tol)
%Class1D_Plus([1;2;7;14;18;50;61;62;99;200;321;322;322],1.5)
%输入的数据要是不存在0元素的数据,可以有重复元素
%对输入的一维数组num1D分类(y值),如果相邻两点的距离
%num1D是列向量
%小于tol,则被划分为同一列,不足的补0
%输出的是一个矩阵,每一列都表示是一类
%如果所有相邻的两个数的差值都大于tol,则返回[];
%注意tol是大于0的正数;
%同一类元素重复次数加小于delta的元素个数不能超过8(这意味着出现了超过8重简并的情况)
%对输入的列数据长度无要求
tic
judge0=0;%初始化
if length(unique(num1D))~=length(num1D)
disp('输入的数据存在重复元素!');mat0=Repsta(num1D);lie_mat0=size(mat0,2);%mat0的列数
judge0=1;%若为1,表示存在重复元素
end
sort_num1D=sort(num1D);%从小到大
Delta=abs(sort_num1D(2:end)-sort_num1D(1:end-1));judge=(Delta<tol);%列
if unique(judge)==0op=[];elsecount=1;tcol=[];tMat=[];forzz=1:(length(sort_num1D)-1)delta=sort_num1D(zz+1)-sort_num1D(zz);if delta<tol
tcol=[tcol;sort_num1D(zz+1);sort_num1D(zz)];elseif length(unique(tcol))~=8tcol=[unique(tcol);zeros(8-length(unique(tcol)),1)];
end
tMat(:,count)=tcol;count=count+1;tcol=[];
end
end
if length(unique(tcol))~=8tcol=[unique(tcol);zeros(8-length(unique(tcol)),1)];elseif length(unique(tcol))==8tcol=[unique(tcol)];
end
end
if isempty(tMat)==1tMat=[(tcol)];elsetMat=[tMat,tcol];
end
tMat(:,all(tMat==0))=[];%删除全0列
op=tMat;
%=========================
%=========================ifjudge0==1%存在重复元素
op2=op;forww=1:lie_mat0
Repnum=mat0(1,ww);%重复的元素
Repcount=mat0(2,ww);%重复的次数
[~,lie]=find(op2==Repnum);t_lie=sort(unique(op2(:,lie)));%列数据
t_lie(t_lie==0)=[];%删除0元素
t_lie=[sort([t_lie;Repnum*ones(Repcount-1,1)]);zeros(8-length(t_lie)-Repcount+1,1)];
op2(:,lie)=t_lie;
end
op=op2;
end
end
toc
end
function[op]=Repsta(col_num)
%Repsta([1;2;3;4;4;1;1;1;6;7;9;0;0;12;13;12;3])
%输入一个列向量col_num
%输出一个矩阵op
%op的大小为两行n列
%第一行是重复的元素
%第二行是对应元素重复的次数
%如果没有重复的元素,返回空集矩阵
unique_col_num=unique(col_num);len_uni_col_num=length(unique_col_num);len_col_num=length(col_num);iflen_uni_col_num==len_col_num
op=[];elsecount=0;forxx=1:len_uni_col_num
tp=unique_col_num(xx);Site=find(col_num==tp);%位置
len_Site=length(Site);if len_Site>1count=count+1;
op(1:2,count)=[tp;len_Site];
end
end
end
end