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
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 arr ay , TABLE is a nu meric 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 = '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
复制代码
【例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]
复制代码
行元素出现的频数、频率。
>> 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]
%
%
%
%
%
%
%
%
%
%
if isnumeric(x)
else
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
else
end
如何统计一个数组中各数字(元素)出现的频数、频率和累积频率?这里以案例形式做一个总结。
第一种方法:调用MATLAB自带的函数tabulate统计一个数组中各数字(元素)出现的频数、频率
【例1】统计数值型数组中各元素出现的频数、频率。
>> x = [2
>> tabulate(x(:))
复制代码
【例2】统计字符串中各字符出现的频数、频率。
>> x = [ 'If x is a numeric arr ay , TABLE is a nu meric matrix.' ]';
>> tabulate(x)
复制代码
【例3】统计字符型数组中各行元素出现的频数、频率。
>> x = ['崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
>> tabulate(x)
复制代码
【例4】统计字符串元胞数组中各字符串出现的频数、频率。
>> x = {'崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
'叶鹏';'关泽满';'谢中华';'王**';'孙乃喆';'崔家峰';'谢中华'};
>> tabulate(x)
复制代码
【例5】统计名义尺度(如性别,职业,产品型号等)数组中各元素出现的频数、频率。
>> load fisheriris
>> species = nominal(species);
>> tabulate(species)
复制代码
第二种方法:自编效率更高的函数HistRate(代码如下),调用HistRate函数统计一个数组中各数字(元素)出现的频数、频率和累积频率。
函数HistRate的代码:
function result = HistRate(x)
%
%
%
%
%
%
%
%
%
%
if isnumeric(x)
else
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
else
end
复制代码
【例1】统计数值型数组中各元素出现的频数、频率。
>> x = [2
>> HistRate(x)
复制代码
【例2】统计字符串中各字符出现的频数、频率。
>> x = ['If x is a numeric array, TABLE is a numeric matrix.']';
>> HistRate(x)
ans =
复制代码
行元素出现的频数、频率。
>> x = ['崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
>> HistRate(x)
ans =
复制代码
【例4】统计字符串元胞数组中各字符串出现的频数、频率。
>> x = {'崔家峰';'孙乃喆';'安立群';'王洪武';'王玉杰';'高纯静';'崔家峰';
'叶鹏';'关泽满';'谢中华';'王**';'孙乃喆';'崔家峰';'谢中华'};
>> HistRate(x)
ans =
复制代码
【例5】统计名义尺度(如性别,职业,产品型号等)数组中各元素出现的频数、频率。
>> load fisheriris
>> species = nominal(species);
>> HistRate(species)
ans =