我从Matlab的histc函数中得到了一些意想不到的结果。我正在进入以下
x = [0.19 0.06 0.26 0.32 0.35 0.09 0.05 0.21 0.48 0.21 0.23 0.12 0.22 0.16 0.35 0.13 0.34 0.07 0.16 0.45]; %My data
edges = [0.05:0.10:.55];
n=histc(x,edges);
现在当我执行代码时,我发现n有值
>> n
n =
6 7 5 1 1 0
但是,基于我期望(并希望)的Matlab帮助文件:
Bin [0.05,0.15] = 6
Bin [0.15,0.25] = 7
Bin [0.25,0.35] = 3
Bin [0.35,0.45] = 2
Bin [0.45,0.55] = 2
我错过了什么吗?似乎无法弄清楚为什么我会得到这个结果......
答案 0 :(得分:2)
这是一个浮点问题。
例如:
x
的值为0.35
。edge
的值0.35
,由0.05 + (3 * 0.1)
但是看看Matlab控制台上会发生什么:
>> 0.35
ans =
0.3500
>> 0.05 + (3 * 0.1)
ans =
0.3500
>> 0.05 + (3 * 0.1) == 0.35
ans =
0
>> 0.05 + (3 * 0.1) > 0.35
ans =
1
Matlab认为0.05 + (3 * 0.1)
大于0.35
,并把它放在“错误的”垃圾箱上。
如果手动分配edge
数组,则会得到所需的结果:
>> edges = [0.05 0.15 0.25 0.35 0.45 0.55];
>> n = histc(sort(x),edges)
n =
6 7 3 2 2 0
答案 1 :(得分:1)
Rafael Monteiro's Answer告诉您问题的原因,要解决问题,请使用linspace
:
edges = [0.05:0.10:.55];
X = edges == 0.35
edges = 0.0500 0.1500 0.2500 0.3500 0.4500 0.5500
X = 0 0 0 0 0 0
没有定义正确的bin边缘,但是:
edges = linspace(0.05,0.55,6); %// 6 = (0.55-0.05)/0.1+1
X = edges == 0.35
edges = 0.0500 0.1500 0.2500 0.3500 0.4500 0.5500
X = 0 0 0 1 0 0
确实
但为什么linspace
起作用而结肠操作员不起作用?正如文件实际上所说:
linspace
函数生成线性间隔矢量。它很相似 到冒号运算符:
,但可以直接控制数量 分。
但仔细研究一下这个函数会发现,space-vector是用整数(0:n1
)生成的,因此没有浮点问题,后来缩放到所需的边界。
n1 = n-1
c = (d2 - d1).*(n1-1) % opposite signs may cause overflow
if isinf(c)
y = d1 + (d2/n1).*(0:n1) - (d1/n1).*(0:n1)
else
y = d1 + (0:n1).*(d2 - d1)/n1
end