在 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) < 边(结束)?
考虑以下代码:
n = histc(x, [edges(1) edges]);
n(1) = sum(x==edges(1));
n(end) = [];
根据发布的问题,以上将返回:
edges(1)
edges(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)
由于edges
参数必须具有单调非递减的值,因此翻转边缘行为的一种方法是否定和翻转edges
参数并否定值以进行分箱。如果您随后翻转HISTC的 bin 计数输出,您应该会看到 HISTC 的典型边缘行为反转:
n = fliplr(histc(-x,-fliplr(edges)));
上面使用FLIPLR,因此x
并且edges
应该是行向量(即 1×N)。此代码将根据以下标准对数据进行分类:
n(1)
计算x
该 match的任何值edges(1)
。n(k)
对这些值进行计数,x(i)
使得edges(k-1) < x(i) <= edges(k)
.请注意,这会翻转所有bin 的边缘行为,而不仅仅是第一个和最后一个 bin!用于 bin 的 HISTC的典型n(k)
行为使用等式edges(k) <= x(i) < edges(k+1)
(注意索引之间的差异和哪一侧有等号!)。
编辑:经过一番讨论......
如果您想根据以下标准对数据进行分箱:
n(1)
计算x
该 match的任何值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)
,被丢弃。