Matlab统计元素出现次数

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Matlab统计元素出现次数

slandarer   2022-06-03 我要评论

前言

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

但是发现了两个问题:

当元素中英文混杂时:

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

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

图片

当元素为纯整数数值时:

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

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

图片

因而,为了解决这俩问题,我自行写了个元素统计类: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()

图片

统计单词、名称

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

图片

统计字符

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()

图片

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

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

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们