目录
  • 前言
  • 工具函数类
  • 使用方式
    • 统计数字
    • 统计单词、名称
    • 统计字符
  • 完整代码

    前言

    统计数组中各个元素数量是一个很常用的功能,但我试着用了MATLAB中自带的统计函数 tabulate:

    但是发现了两个问题:

    当元素中英文混杂时:

    X = {'slandarer';'slandarer';'hikari';'hikari';'公众号';'公众号';
        'CSDN';'CSDN';'CSDN'};
    tabulate(X)

    我们发现中英文混杂时输出会对不齐:

    Matlab实现统计集合中各元素出现次数的示例代码

    当元素为纯整数数值时:

    X=[6,5,6];
    tabulate(X)

    即使元素没出现也会从1开始一直显示到最大值:

    Matlab实现统计集合中各元素出现次数的示例代码

    因而,为了解决这俩问题,我自行写了个元素统计类:statable

    工具函数类

    classdef statable
        properties
            % properties relationship:
            % obj.Value=obj.Name(obj.Pos);
            % obj.Percent=obj.Count/length(X);
            % obj.Table=table(obj.Value,obj.Count,obj.Percent);
            Value;Count;Percent;Table;Name;Pos
        end
    
        methods
            % 构造函数
            function obj=statable(X)
                flag=false;
                if isnumeric(X),flag=true;X=X(:);end
    
                % 元素类型转换
                SX=sort(X);OrgX=SX;
                [SX,Xid]=grp2idx(SX);
                obj.Name=Xid;
                SX=SX(~isnan(SX));
                DSX=diff(SX);
    
                % 出现次数统计
                DSX=find([DSX;1]);
                obj.Pos=SX(DSX);
                obj.Count=diff([0;DSX]);
                obj.Percent=obj.Count/length(SX);
                
                % 存储为table
                obj.Value=obj.Name(obj.Pos);
                if flag,obj.Value=unique(OrgX);end
                obj.Table=table(obj.Value,obj.Count,obj.Percent);
            end
            % 输出函数
            function show(obj)
                fprintf(1,'%15s%10s%11s\n','Value','Count','Percent');
                for i=1:length(obj.Pos)
                    tValue=obj.Name{obj.Pos(i)};
                    mspace=length(tValue)-sum(abs(tValue)>31&abs(tValue)<127);
                    fprintf(['%',num2str(round(15-mspace)),'s'],tValue);
                    fprintf('%10d',obj.Count(i));
                    fprintf('%10.3f%%\n',100*obj.Percent(i));
                end
            end
        end
    end

    使用方式

    统计数字

    X=[randi([0,10],[100000,1])];
    T=statable(X);
    T.show()

    Matlab实现统计集合中各元素出现次数的示例代码

    统计单词、名称

    X = {'slandarer';'slandarer';'hikari';'hikari';'公众号';'公众号';
        'CSDN';'CSDN';'CSDN'};
    T=statable(X);
    T.show()

    Matlab实现统计集合中各元素出现次数的示例代码

    统计字符

    X=['Life is full of confusing and disordering Particular time,a particular location,',...
        'Do the arranged thing of ten million time in the brain,Step by step ,',...
        'the life is hard to avoid delicacy and stiffness No enthusiasm forever,',...
        'No unexpected happening of surprising and pleasing So,',...
        'only silently ask myself in mind Next happiness,when will come?']';
    
    T=statable(X);
    T.show()

    Matlab实现统计集合中各元素出现次数的示例代码

    当然,也可以通过如下方式获取其他数据:

    T=statable(X);

    T.Table

    T.Value

    T.Count

    T.Percent

    完整代码

    statable

    classdef statable
        properties
            % properties relationship:
            % obj.Value=obj.Name(obj.Pos);
            % obj.Percent=obj.Count/length(X);
            % obj.Table=table(obj.Value,obj.Count,obj.Percent);
            Value;Count;Percent;Table;Name;Pos
        end
    
        methods
            % 构造函数
            function obj=statable(X)
                flag=false;
                if isnumeric(X),flag=true;X=X(:);end
    
                % 元素类型转换
                SX=sort(X);OrgX=SX;
                [SX,Xid]=grp2idx(SX);
                obj.Name=Xid;
                SX=SX(~isnan(SX));
                DSX=diff(SX);
    
                % 出现次数统计
                DSX=find([DSX;1]);
                obj.Pos=SX(DSX);
                obj.Count=diff([0;DSX]);
                obj.Percent=obj.Count/length(SX);
                
                % 存储为table
                obj.Value=obj.Name(obj.Pos);
                if flag,obj.Value=unique(OrgX);end
                obj.Table=table(obj.Value,obj.Count,obj.Percent);
            end
            % 输出函数
            function show(obj)
                fprintf(1,'%15s%10s%11s\n','Value','Count','Percent');
                for i=1:length(obj.Pos)
                    tValue=obj.Name{obj.Pos(i)};
                    mspace=length(tValue)-sum(abs(tValue)>31&abs(tValue)<127);
                    fprintf(['%',num2str(round(15-mspace)),'s'],tValue);
                    fprintf('%10d',obj.Count(i));
                    fprintf('%10.3f%%\n',100*obj.Percent(i));
                end
            end
        end
    end

    demo

    % demo to test HistRate
    
    X = {'slandarer';'slandarer';'hikari';'hikari';'公众号';'公众号';
        'CSDN';'CSDN';'CSDN'};
    T=statable(X);
    T.show()
    disp(' ')
    
    
    X=[randi([0,10],[100000,1])];
    T=statable(X);
    T.show()
    disp(' ')
    
    X=['Life is full of confusing and disordering Particular time,a particular location,',...
        'Do the arranged thing of ten million time in the brain,Step by step ,',...
        'the life is hard to avoid delicacy and stiffness No enthusiasm forever,',...
        'No unexpected happening of surprising and pleasing So,',...
        'only silently ask myself in mind Next happiness,when will come?']';
    
    T=statable(X);
    T.show()
    disp(' ')
    
    T.Table
    %T.Value
    %T.Count
    %T.Percent
    
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。