服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - Matlab实现统计集合中各元素出现次数的示例代码

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

2022-11-22 12:29slandarer C/C++

统计数组中各个元素数量是一个很常用的功能,本文主要为大家介绍了如何利用Matlab优雅的统计集合中各元素出现的次数,感兴趣的可以了解一下

前言

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

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

原文链接:https://mp.weixin.qq.com/s/W8Bbvq4LCusQiShqFIUukw

延伸 · 阅读

精彩推荐
  • C/C++C语言如何利用异或进行两个值的交换详解

    C语言如何利用异或进行两个值的交换详解

    最近在工作中遇到了两个值交换的需求,发现自己对异或有些忘记,所以索性写出来,方便以后需要的时候参考学习,下面这篇文章主要给大家介绍了关于...

    青儿哥哥4052021-06-01
  • C/C++Species Tree 利用HashTable实现实例代码

    Species Tree 利用HashTable实现实例代码

    这篇文章主要介绍了Species Tree 利用HashTable实现实例代码的相关资料,需要的朋友可以参考下...

    C语言教程网3882021-04-28
  • C/C++C语言实现抢红包算法

    C语言实现抢红包算法

    这篇文章主要为大家详细介绍了C语言抢红包算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    LSC的博客6222021-09-28
  • C/C++C++ list的实例详解

    C++ list的实例详解

    这篇文章主要介绍了 C++ list的实例详解的相关资料,希望通过本文大家能够理解掌握这部分内容,需要的朋友可以参考下...

    阳光岛主11532021-06-03
  • C/C++c++下迭代器总结

    c++下迭代器总结

    大家好,本篇文章主要讲的是c++下迭代器总结,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    CSSDCC3772022-07-24
  • C/C++使用C++实现迷宫游戏

    使用C++实现迷宫游戏

    这篇文章主要为大家详细介绍了C++实现迷宫游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Viitasca6532021-08-27
  • C/C++c++几种基本的插入排序(图文)

    c++几种基本的插入排序(图文)

    这篇文章主要介绍了c++几种基本的插入排序(图文),需要的朋友可以参考下...

    C++教程网4412021-02-21
  • C/C++C语言变长数组 struct中char data[0]的用法详解

    C语言变长数组 struct中char data[0]的用法详解

    下面小编就为大家带来一篇C语言变长数组 struct中char data[0]的用法详解。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来看看...

    C语言教程网6432021-04-26