在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)<边缘(端部)?
答案 0 :(得分:2)
请考虑以下代码:
n = histc(x, [edges(1) edges]);
n(1) = sum(x==edges(1));
n(end) = [];
根据发布的问题,上述内容将返回:
edges(1)
edges(k-1) <= x(i) < edges(k)
这与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,因此x
和edges
应为行向量(即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函数找到)。
edges(end)
的值的数量。