1

在 MATLAB 中:

n = histc(x,edges);

被定义为表现如下:

如果边(k) <= x(i) <边(k+1),n(k) 计算值x(i)。最后一个 bin 计算与边(结束)匹配的任何 x 值。

有什么方法可以翻转结束行为,使得 n(1) 计算与边 (1) 匹配的 x 的任何值,并且 n(end) 计算满足边 (end-1) <= x 的值 x(i) (i) < 边(结束)?

4

2 回答 2

2

考虑以下代码:

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

根据发布的问题,以上将返回:

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

这与新手解决方案的不同之处在于他的答案使用了边界:(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)

于 2009-10-13T02:24:05.223 回答
0

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

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

上面使用FLIPLR,因此x并且edges应该是行向量(即 1×N)。此代码将根据以下标准对数据进行分类:

  • 第一个 binn(1)计算x该 match的任何值edges(1)
  • 其他 binn(k)对这些值进行计数,x(i)使得edges(k-1) < x(i) <= edges(k).

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


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

如果您根据以下标准对数据进行分箱:

  • 第一个 binn(1)计算x该 match的任何值edges(1)
  • 第二个 bin对这样n(2)的值进行计数。x(i)edges(1) < x(i) < edges(2)
  • 其他 binn(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),被丢弃。

于 2009-10-12T23:43:08.067 回答