Histc - 意外结果:分类在错误箱柜中的值

时间:2014-04-08 03:34:42

标签: matlab histogram

我从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

我错过了什么吗?似乎无法弄清楚为什么我会得到这个结果......

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