matlab统计 频数、频率和累积频率

function result = HistRate(x)
   HistRate(x),统计数组 x 中的元素出现的频数、频率和累积频率,以表格形式显示在屏幕上.
   x可以是数值型数组、字符串、字符型数组、字符串元胞数组和名义尺度数组。
%
   result = HistRate(x ),返回矩阵或元胞数组result,它是 多行4 列的矩阵或元胞数组,
   四列分别对应取值、频数、频率、累积频率。 当x是数值型数组时,result为矩阵;当x
   是字符串、字符型数组、字符串元胞数组和名义尺度数组时,result为元胞数组。
%
   用户还可参考tabulate函 数,该函数比tabulate函 数的效率高
 
   Copyright xiezhh,2010.3.8
if isnumeric(x)
       x = x(:);
       x = x(~isnan(x));
       xid = [];
else
       [x,xid] = grp2idx(x);
       x = x(~isnan(x));
end
x = sort(x(:));       % 排序
m = length(x);
x1 = diff(x);       % 求差分
x1(end + 1) = 1;
x1 = find(x1);
CumFreq = x1/m;
value = x(x1);
x1 = [0; x1];
Freq1 = diff(x1);
Freq2 = Freq1/m;
if   nargout == 0
       if isempty(xid)
               fmt1 = 's     %8s     %6s       %6sn';
               fmt2 = '   d         �         %6.2f%%         %6.2f%%n';
               fprintf(1, fmt1, '取值', '频数', '频率', '累积频率');
               fprintf(1, fmt2, [value'; Freq1'; 100*Freq2'; 100*CumFreq']);
       else
               head = {'取值', '频数', '频率(%)', '累积频率(%)'};
               [head;xid,num2cell([Freq1, 100*Freq2, 100*CumFreq])]
       end
else
       if isempty(xid)
               result = [value Freq1 Freq2 CumFreq];
       else
               result = [xid,num2cell([Freq1, Freq2, CumFreq])];
       end
end


如何统计一个数组中各数字(元素)出现的频数、频率和累积频率?这里以案例形式做一个总结。
第一种方法:调用MATLAB自带的函数tabulate统计一个数组中各数字(元素)出现的频数、频率
【例1】统计数值型数组中各元素出现的频数、频率。
>> x = [2                                  2
                                          5
                                          5];
>> tabulate(x(:))
    Value      Count     Percent
                              1.96%
                              7.84%
                   14         27.45%
                   10         19.61%
                   10         19.61%
                             11.76%
                              7.84%
                              1.96%
                              1.96%
复制代码
【例2】统计字符串中各字符出现的频数、频率。
>> x = [ 'If x is a numeric arr ay , TABLE is a nu meric matrix.' ]';
>> tabulate(x)
    Value      Count     Percent
                              2.44%
                              2.44%
                              4.88%
                             12.20%
                              4.88%
                             12.20%
                              4.88%
                              4.88%
                              7.32%
                              4.88%
                             12.20%
                              4.88%
                              2.44%
                              2.44%
                              2.44%
                              2.44%
                              2.44%
                              2.44%
                              2.44%
                              2.44%
                              2.44%
复制代码
【例3】统计字符型数组中各行元素出现的频数、频率。
>> x = ['崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
              '叶 鹏';'关泽满';'谢中华';'王**';'孙乃喆';'崔家峰';'谢中华'];
>> tabulate(x)
    Value      Count     Percent
      崔家峰                     21.43%
      孙乃喆                     14.29%
      安立群                      7.14%
      王洪武                      7.14%
      王玉杰                      7.14%
      高纯静                      7.14%
      叶 鹏                      7.14%
      关泽满                      7.14%
      谢中华                     14.29%
      王**                      7.14%
复制代码
【例4】统计字符串元胞数组中各字符串出现的频数、频率。
>> x = {'崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
'叶鹏';'关泽满';'谢中华';'王**';'孙乃喆';'崔家峰';'谢中华'};
>> tabulate(x)
    Value      Count     Percent
      崔家峰                     21.43%
      孙乃喆                     14.29%
      安立群                      7.14%
      王洪武                      7.14%
      王玉杰                      7.14%
      高纯静                      7.14%
         叶鹏                      7.14%
      关泽满                      7.14%
      谢中华                     14.29%
      王**                      7.14%
复制代码
【例5】统计名义尺度(如性别,职业,产品型号等)数组中各元素出现的频数、频率。
>> load fisheriris
>> species = nominal(species);
>> tabulate(species)
           Value      Count     Percent
          setosa           50         33.33%
    versicolor           50         33.33%
     virginica           50         33.33%
复制代码
第二种方法:自编效率更高的函数HistRate(代码如下),调用HistRate函数统计一个数组中各数字(元素)出现的频数、频率和累积频率。
函数HistRate的代码:
function result = HistRate(x)
   HistRate(x),统计数组 x 中的元素出现的频数、频率和累积频率,以表格形式显示在屏幕上.
   x可以是数值型数组、字符串、字符型数组、字符串元胞数组和名义尺度数组。
%
   result = HistRate(x),返回矩阵或元胞数组result,它是多行4列的矩阵或元胞数组,
   四列分别对应取值、频数、频率、累积频率。当x是数值型数组时,result为矩阵;当x
   是字符串、字符型数组、字符串元胞数组和名义尺度数组时,result为元胞数组。
%
   用户还可参考tabulate函数,该函数比tabulate函数的效率高。
  
   Copyright xiezhh,2010.3.8
if isnumeric(x)
      x = x(:);
      x = x(~isnan(x));
      xid = [];
else
      [x,xid] = grp2idx(x);
      x = x(~isnan(x));
end
x = sort(x(:));      % 排序
m = length(x);
x1 = diff(x);      % 求差分
x1(end + 1) = 1;
x1 = find(x1);
CumFreq = x1/m;
value = x(x1);
x1 = [0; x1];
Freq1 = diff(x1);
Freq2 = Freq1/m;
if    nargout == 0
      if isempty(xid)
              fmt1 = 's     %8s     %6s      %6sn';
              fmt2 = '           �         %6.2f%%         %6.2f%%n';
              fprintf(1, fmt1, '取值', '频数', '频率', '累积频率');
              fprintf(1, fmt2, [value'; Freq1'; 100*Freq2'; 100*CumFreq']);
      else
              head = {'取值', '频数', '频率(%)', '累积频率(%)'};
              [head;xid,num2cell([Freq1, 100*Freq2, 100*CumFreq])]
      end
else
      if isempty(xid)
              result = [value Freq1 Freq2 CumFreq];
      else
              result = [xid,num2cell([Freq1, Freq2, CumFreq])];
      end
end
复制代码
【例1】统计数值型数组中各元素出现的频数、频率。
>> x = [2                                  2
                                          5
                                          5];
>> HistRate(x)
               取值               频数           频率          累积频率
                                              1.96%           1.96%
                                              7.84%           9.80%
                                    14          27.45%          37.25%
                                    10          19.61%          56.86%
                                    10          19.61%          76.47%
                                             11.76%          88.24%
                                              7.84%          96.08%
                                              1.96%          98.04%
                                              1.96%         100.00%
复制代码
【例2】统计字符串中各字符出现的频数、频率。
>> x = ['If x is a numeric array, TABLE is a numeric matrix.']';
>> HistRate(x)
ans =
      '取值'      '频数'      '频率(%)'      '累积频率(%)'
      'I'           [     1]      [ 2.4390]      [         2.4390]
      'f'           [     1]      [ 2.4390]      [         4.8780]
      'x'           [     2]      [ 4.8780]      [         9.7561]
      'i'           [     5]      [12.1951]      [      21.9512]
      's'           [     2]      [ 4.8780]      [      26.8293]
      'a'           [     5]      [12.1951]      [      39.0244]
      'n'           [     2]      [ 4.8780]      [      43.9024]
      'u'           [     2]      [ 4.8780]      [      48.7805]
      'm'           [     3]      [ 7.3171]      [      56.0976]
      'e'           [     2]      [ 4.8780]      [      60.9756]
      'r'           [     5]      [12.1951]      [      73.1707]
      'c'           [     2]      [ 4.8780]      [      78.0488]
      'y'           [     1]      [ 2.4390]      [      80.4878]
      ','           [     1]      [ 2.4390]      [      82.9268]
      'T'           [     1]      [ 2.4390]      [      85.3659]
      'A'           [     1]      [ 2.4390]      [      87.8049]
      'B'           [     1]      [ 2.4390]      [      90.2439]
      'L'           [     1]      [ 2.4390]      [      92.6829]
      'E'           [     1]      [ 2.4390]      [      95.1220]
      't'           [     1]      [ 2.4390]      [      97.5610]
      '.'           [     1]      [ 2.4390]      [              100]
复制代码

行元素出现的频数、频率。
>> x = ['崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
              '叶 鹏';'关泽满';'谢中华';'王**';'孙乃喆';'崔家峰';'谢中华'];
>> HistRate(x)
ans =
      '取值'          '频数'      '频率(%)'      '累积频率(%)'
      '崔家峰'      [     3]      [21.4286]      [      21.4286]
      '孙乃喆'      [     2]      [14.2857]      [      35.7143]
      '安立群'      [     1]      [ 7.1429]      [      42.8571]
      '王洪武'      [     1]      [ 7.1429]      [               50]
      '王玉杰'      [     1]      [ 7.1429]      [      57.1429]
      '高纯静'      [     1]      [ 7.1429]      [      64.2857]
      '叶 鹏'            1]      [ 7.1429]      [      71.4286]
      '关泽满'      [     1]      [ 7.1429]      [      78.5714]
      '谢中华'      [     2]      [14.2857]      [      92.8571]
      '王**'      [     1]      [ 7.1429]      [              100]
复制代码
【例4】统计字符串元胞数组中各字符串出现的频数、频率。
>> x = {'崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
'叶鹏';'关泽满';'谢中华';'王**';'孙乃喆';'崔家峰';'谢中华'};
>> HistRate(x)
ans =
      '取值'          '频数'      '频率(%)'      '累积频率(%)'
      '崔家峰'      [     3]      [21.4286]      [      21.4286]
      '孙乃喆'      [     2]      [14.2857]      [      35.7143]
      '安立群'      [     1]      [ 7.1429]      [      42.8571]
      '王洪武'      [     1]      [ 7.1429]      [               50]
      '王玉杰'      [     1]      [ 7.1429]      [      57.1429]
      '高纯静'      [     1]      [ 7.1429]      [      64.2857]
      '叶鹏'             1]      [ 7.1429]      [      71.4286]
      '关泽满'      [     1]      [ 7.1429]      [      78.5714]
      '谢中华'      [     2]      [14.2857]      [      92.8571]
      '王**'      [     1]      [ 7.1429]      [              100]
复制代码
【例5】统计名义尺度(如性别,职业,产品型号等)数组中各元素出现的频数、频率。
>> load fisheriris
>> species = nominal(species);
>> HistRate(species)
ans =
      '取值'                '频数'      '频率(%)'      '累积频率(%)'
      'setosa'                50]      [33.3333]      [      33.3333]
      'versicolor'      [    50]      [33.3333]      [      66.6667]
      'virginica'           50]      [33.3333]      [              100]

猜你喜欢

转载自blog.csdn.net/lhbbzh/article/details/78574739
今日推荐