在日常计算,工作中使用MATLAB经常会遇到这样的一个问题:如何统计数组中各数字(元素)出现的频数、频率和累积频率?本文就按照案例演示的方式做一个总结。
第一种方法:调用MATLAB自带的函数tabulate进行统计
【例1】统计数值型数组中各元素出现的频数、频率。
>> x = [2 2 6 5 2 3 2 4 3 4 3 4 4 4 4 2 2 6 0 4 7 2 5 8 3 1 3 2 5 3 6 2 3 5 4 3 1 4 2 2 2 3 1 5 2 6 3 4 1 2 5]; >> tabulate(x(:)) Value Count Percent 0 1 1.96% 1 4 7.84% 2 14 27.45% 3 10 19.61% 4 10 19.61% 5 6 11.76% 6 4 7.84% 7 1 1.96% 8 1 1.96%
【例2】统计字符串中各字符出现的频数、频率。
>> x = ['If x is a numeric array, TABLE is a numeric matrix.']'; >> tabulate(x) Value Count Percent I 1 2.44% f 1 2.44% x 2 4.88% i 5 12.20% s 2 4.88% a 5 12.20% n 2 4.88% u 2 4.88% m 3 7.32% e 2 4.88% r 5 12.20% c 2 4.88% y 1 2.44% , 1 2.44% T 1 2.44% A 1 2.44% B 1 2.44% L 1 2.44% E 1 2.44% t 1 2.44% . 1 2.44%
【例3】统计字符型数组中各行元素出现的频数、频率。
>> x = ['崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰'; '叶 鹏';'关泽满';'谢中华';'王**';'孙乃喆';'崔家峰';'谢中华']; >> tabulate(x) Value Count Percent 崔家峰 3 21.43% 孙乃喆 2 14.29% 安立群 1 7.14% 王洪武 1 7.14% 王玉杰 1 7.14% 高纯静 1 7.14% 叶 鹏 1 7.14% 关泽满 1 7.14% 谢中华 2 14.29% 王** 1 7.14%
【例4】统计字符串元胞数组中各字符串出现的频数、频率。
>> x = {'崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰'; '叶鹏';'关泽满';'谢中华';'王**';'孙乃喆';'崔家峰';'谢中华'}; >> tabulate(x) Value Count Percent 崔家峰 3 21.43% 孙乃喆 2 14.29% 安立群 1 7.14% 王洪武 1 7.14% 王玉杰 1 7.14% 高纯静 1 7.14% 叶鹏 1 7.14% 关泽满 1 7.14% 谢中华 2 14.29% 王** 1 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 = '%11s %8s %6s %6s\n'; fmt2 = ' %10d %8d %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 6 5 2 3 2 4 3 4 3 4 4 4 4 2 2 6 0 4 7 2 5 8 3 1 3 2 5 3 6 2 3 5 4 3 1 4 2 2 2 3 1 5 2 6 3 4 1 2 5]; >> HistRate(x) 取值 频数 频率 累积频率 0 1 1.96% 1.96% 1 4 7.84% 9.80% 2 14 27.45% 37.25% 3 10 19.61% 56.86% 4 10 19.61% 76.47% 5 6 11.76% 88.24% 6 4 7.84% 96.08% 7 1 1.96% 98.04% 8 1 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]
【例3】统计字符型数组中各行元素出现的频数、频率。
>> 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]