一维列数组分类加强版(可以对重复元素使用,但不能含有0元素)

该代码实现了一种对一维数组进行分类的算法,根据相邻元素间的距离判断是否归为一类。如果距离小于给定阈值tol,则归为一类,输出的矩阵中每一列代表一类。同时,代码检查输入数据是否存在重复元素,并处理超过8次简并的情况。重复元素会被合并到同一列。此外,代码还包括了一个辅助函数用于检测和统计输入列向量中的重复元素。
摘要由CSDN通过智能技术生成

需仔细阅读代码头的注释


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)==0
    op=[];
else
count=1;
tcol=[];
tMat=[];
    for zz=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)];
    else
        if length(unique(tcol))~=8
            tcol=[unique(tcol);zeros(8-length(unique(tcol)),1)];
        end
        tMat(:,count)=tcol;
        
        count=count+1;
        tcol=[];
    end
 
    end
    
    
    if length(unique(tcol))~=8
        tcol=[unique(tcol);zeros(8-length(unique(tcol)),1)];
    else
        if length(unique(tcol))==8
        tcol=[unique(tcol)];
        end
    end
    
  
    
    if isempty(tMat)==1
        tMat=[(tcol)];
    else
        tMat=[tMat,tcol];
    end
    
    
    tMat(:,all(tMat==0))=[];%删除全0列
    op=tMat;
  
    
    %=========================
    %=========================
    
    
    
    if judge0==1%存在重复元素
        op2=op;
        
        for ww=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);

if len_uni_col_num==len_col_num
  op=[];
else
    
    count=0;
    for xx=1:len_uni_col_num
        tp=unique_col_num(xx);
        Site=find(col_num==tp);%位置
        len_Site=length(Site);
        
        if len_Site>1
            count=count+1;
            op(1:2,count)=[tp;len_Site];
        end
        
        
    end
    
    
    
end


end

未详细测试,如有错误欢迎指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值