有一个数据集(仅用于测试),如下所示:0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5我想获得最小 0.1 和最大 1.5 之间的频率计数,箱(步长)为 0.1。我已经在Matlab,Octave,Origin和AWK脚本中进行了测试。但是,我得到了完全不同的结果。
1. 矩阵实验室
data = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge = 0.1:0.1:1.5;
count = histc(data, edge);
结果是:
count = [2 4 0 2 2 0 0 0 0 0 1 1 1 1 1]
2. 八度
data = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge = 0.1:0.1:1.5;
count = histc(data, edge);
结果是:
count = [2 2 2 2 2 0 0 0 0 0 1 2 0 1 1]
3. 起源
使用命令"频率计数",设置min=0.1
、max=1.5
、step size=0.1.
结果是:
count = [2 4 0 2 2 0 0 0 0 0 2 1 1 1]
4. AWK
{...;count[data/0.1]++;} ...
结果是:
count = [2 4 0 2 2 0 0 0 0 0 2 0 2 0 1]
为什么我会得到这些不同的结果?是我做错了什么,还是误解了"频率计数"的概念?我认为上述任何结果都不是正确的...你能告诉我我该怎么办吗?
一个快速的解决方法是移动边缘
矩阵:
data = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge = 0.05:0.1:1.55;
count = histc(data, edge)
结果:
Columns 1 through 9
2 2 2 2 2 0 0 0 0
Columns 10 through 16
0 1 1 1 1 1 0
注意:末端有一个杂散峰,因为长度(边)=长度(数据)+1。
然后正如Paul R所建议的那样,它归结为精度和四舍五入。您必须进入每个频率计数函数,以查看每种语言如何解释它。如果我是你,我会把所有东西都乘以 10 并使它们变成 int。
data=int8(data.*10)
edge = 1:15;
count = histc(data, edge)
结果:
Columns 1 through 9
2 2 2 2 2 0 0 0 0
Columns 10 through 15
0 1 1 1 1 1
重要的是人类如何解释它,而不是机器。如果你知道你乘以 10 ^(你的精度)并使它们 int,你不在乎机器到底做了什么。然后,如果数据中有无理数并且仍然看到错误,请检查浮点数的编码方式 (http://en.wikipedia.org/wiki/Floating_point)
干杯。