如何在MATLAB中翻转histc函数的边(1)和边(结束)的定义?

时间:2009-10-12 23:07:24

标签: matlab histogram

在MATLAB中:

n = histc(x,edges);

定义为表现如下:

  

n(k)如果边(k)则计算值x(i)   < = x(i)<边缘(K + 1)。最后一个垃圾箱   计算匹配的x的任何值   边缘(端部)。

有没有办法翻转结束行为,使得n(1)计算与边(1)匹配的x的任何值,并且n(结束)计数满足边的值x(i)(结束-1) < = x(i)<边缘(端部)?

2 个答案:

答案 0 :(得分:2)

请考虑以下代码:

n = histc(x, [edges(1) edges]);
n(1) = sum(x==edges(1));
n(end) = [];

根据发布的问题,上述内容将返回:

  • n(1):计算与edges(1)
  • 匹配的x的任何值
  • n(k)[k~ = 1]:如果edges(k-1) <= x(i) < edges(k)
  • ,则计算值x(i)

这与gnovice解决方案的不同之处在于他的答案使用了界限:edges(k-1) < x(i) <= edges(k)(注意等号的位置)。


为了演示,请考虑这个简单的例子:

x = [0 1 1.5 2 2.5 4 6.5 8 10];
edges = 0:2:10;

>> n = fliplr(histc(-x,-fliplr(edges)))
n =
     1     3     2     0     2     1
  

对应间隔:   0(0,2](2,4)(4,6)(6,8)(8,10)

反对:

>> n = histc(x, [edges(1) edges]);
>> n(1) = sum(x==edges(1));
>> n(end) = []
n =
     1     3     2     1     1     1
  

对应间隔:   0 [0,2] [2,4] [4,6] [6,8] [8,10]

答案 1 :(得分:0)

由于edges参数必须具有单调非递减值,因此翻转边缘行为的一种方法是否定并翻转edges参数并否定binning的值。如果然后从HISTC翻转bin计数输出,您应该看到HISTC的典型边缘行为反转:

n = fliplr(histc(-x,-fliplr(edges)));

以上使用FLIPLR,因此xedges应为行向量(即1-by-N)。此代码将根据以下标准对数据进行bin:

  • 第一个分页n(1)计算与x匹配的edges(1)的任何值。
  • 其他分档n(k)会将值x(i)计为edges(k-1) < x(i) <= edges(k)

请注意,这会翻转所有分档的边缘行为,而不仅仅是第一个和最后一个分档! HISTC的典型行为bin n(k)使用等式edges(k) <= x(i) < edges(k+1)(注意索引之间的差异以及哪一边有等号!)。


编辑:经过一番讨论......

如果想要根据以下标准来存储数据:

  • 第一个分页n(1)计算与x匹配的edges(1)的任何值。
  • 第二个分类n(2)计算值x(i),使edges(1) < x(i) < edges(2)
  • 其他分档n(k)会将值x(i)计为edges(k-1) <= x(i) < edges(k)

然后以下内容应该做到这一点:

n = histc(x,[edges(1) edges(1)+eps(edges(1)) edges(2:end)]);
n(end) = [];

第一个bin应仅捕获等于edges(1)的值,而第二个bin的下边缘应从高于edges(1)的增量值开始(使用EPS函数找到)。

将抛出最后一个bin,它计算等于edges(end)的值的数量。