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

 更新时间:2022年05月05日 11:40:26   作者:slandarer  
统计数组中各个元素数量是一个很常用的功能,本文主要为大家介绍了如何利用Matlab优雅的统计集合中各元素出现的次数,感兴趣的可以了解一下

前言

统计数组中各个元素数量是一个很常用的功能,但我试着用了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

到此这篇关于Matlab实现统计集合中各元素出现次数的示例代码的文章就介绍到这了,更多相关Matlab统计元素出现次数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++下标运算符详解

    C++下标运算符详解

    C语言中的下标运算符用于访问数组或指针变量中的元素,它使用方括号 [] 来表示,并在方括号内指定元素的索引位置,本文给大家详细的讲解一下C++的下标运算符,需要的朋友可以参考下
    2023-09-09
  • Python扩展C/C++库的方法(C转换为Python)

    Python扩展C/C++库的方法(C转换为Python)

    这篇文章主要介绍了Python扩展C/C++库的方法(C转换为Python),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • C语言实现电话簿项目管理

    C语言实现电话簿项目管理

    这篇文章主要为大家详细介绍了C语言实现电话簿项目管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 在C++中使用HP-Socket

    在C++中使用HP-Socket

    这篇文章主要介绍了C++中简单使用HP-Socket,HP-Socket 是一套通用的高性能 TCP/UDP /HTTP 通信 框架 ,包含服务端组件、客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP /HTTP 通信系统,下面来看看更具体的介绍吧
    2021-11-11
  • 详解C++中的函数调用和下标以及成员访问运算符的重载

    详解C++中的函数调用和下标以及成员访问运算符的重载

    这篇文章主要介绍了详解C++中的函数调用和下标以及成员访问运算符,讲到了这些二元运算符使用的语法及重载,需要的朋友可以参考下
    2016-01-01
  • 将字符串str1复制为字符串str2的三种解决方法

    将字符串str1复制为字符串str2的三种解决方法

    以下是对将字符串str1复制为字符串str2的三种解决方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • Qt使用Matlab函数的详细步骤

    Qt使用Matlab函数的详细步骤

    由于项目需要,需要调用现有的matlab程序,下面这篇文章主要给大家介绍了关于Qt使用Matlab函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 如何实现socket网络编程的多线程

    如何实现socket网络编程的多线程

    首先,学好计算机网络知识真的很重要。虽然,学不好不会影响理解下面这个关于宏观讲解,但是,学好了可以自己打渔吃,学不好就只能知道眼前有鱼吃却打不到渔。在Java中网络程序有2种协议:TCP和UDP,下面可以和小编一起学习下
    2019-05-05
  • N叉树的三种遍历(层次遍历、前序遍历、后序遍历)

    N叉树的三种遍历(层次遍历、前序遍历、后序遍历)

    本文主要介绍了N叉树的三种遍历(层次遍历、前序遍历、后序遍历),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C语言文件操作总结

    C语言文件操作总结

    本篇文章给大家通过代码示例讲述了C语言文件操作的相关知识点,对此有兴趣的朋友可以参考学习下。
    2018-03-03

最新评论