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]
以下是利用 MATLAB 计算样本 P3 分布样本理论频率的示例代码: ```matlab % 假设有一个样本 X,其 P3 分布参数为 a = 1 和 b = 2 X = [0.7, 1.3, 1.8, 2.5, 3.1, 3.6, 4.2, 4.7, 5.5]; % 计算样本的分布频率 edges = [0, 1, 2, 3, 4, 5, 6]; % 分组边界 counts = histcounts(X, edges); % 计算每个组的样本数 freq = counts / length(X); % 计算每个组的频率 % 计算理论频率 x = 0:0.1:6; % 生成一组理论值 pdf = p3pdf(x, 1, 2); % 计算 P3 分布的概率密度函数 edges = [0, 1, 2, 3, 4, 5, 6]; % 分组边界 theory_counts = diff(cdfp3(edges, 1, 2)); % 计算每个组的理论频数 theory_freq = theory_counts / length(X); % 计算每个组的理论频率 % 绘制频率分布直方图和理论概率密度函数图 figure; subplot(2,1,1); histogram(X, edges, 'Normalization', 'probability'); title('Sample Frequency Distribution'); xlabel('X'); ylabel('Frequency'); subplot(2,1,2); plot(x, pdf, 'LineWidth', 2); hold on; bar(edges(2:end), theory_freq, 'FaceColor', 'r', 'EdgeColor', 'none'); title('Theoretical Probability Density Function'); xlabel('X'); ylabel('Probability Density'); legend('P3 PDF', 'Theory Freq', 'Location', 'northwest'); hold off; ``` 解释一下代码: 1. 首先定义了一个样本 X,其中包含了一些符合 P3 分布的随机变量; 2. 然后使用 `histcounts` 函数计算样本的分布频率,并使用 `counts / length(X)` 计算每个组的频率; 3. 接着定义了一组理论值 `x`,并使用 `p3pdf` 函数计算 P3 分布的概率密度函数; 4. 使用 `cdfp3` 函数计算每个组的理论频数,并使用 `diff` 函数计算出每个组的理论频数; 5. 最后使用 `bar` 函数绘制频率分布直方图和理论概率密度函数图。 注意:该代码中使用了 P3 分布的概率密度函数和累积分布函数,这些函数需要提前定义。如果你不知道如何定义这些函数,请参考 P3 分布的相关文献或使用 MATLAB 的第三方工具箱。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值