【问题标题】:How to flip the definition of edges(1) and edges(end) for the histc function in MATLAB?如何在 MATLAB 中翻转 histc 函数的边(1)和边(结束)的定义?
【发布时间】:2012-10-02 19:16:55
【问题描述】:

在 MATLAB 中:

n = histc(x,edges);

被定义为如下行为:

n(k) 如果 edges(k) 计算值 x(i)

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

【问题讨论】:

  • @alian:看起来我们对您想要什么感到困惑。如果 n(1) 计算与边 (1) 匹配的 x 值,那么这些值是否也应计入第二个 bin?如果您对 n(k) 使用公式 edges(k-1)

标签: matlab histogram


【解决方案1】:

考虑以下代码:

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)

【讨论】:

  • @Amro:如果您手动进行分箱,则会出现错误。 n(1) 将值0 分箱,而n(2) 将值'0、1、1.5, and n(end)' 分箱值8。请注意,0 被计入两个 bin 中,而 10 永远不会被计算在内。如果您向 x 添加更多零,您将看到 bin 计数已关闭。
  • 我知道...请注意,我完全按照 OP 的描述进行操作:bin k 由包含 edge(k-1) 且不包含 edge(k) 限制。
  • 最后,这取决于您希望等号在哪里(左或右)
  • @Amro:虽然这似乎是 OP 最初 要求的,但我猜这可能是他们的疏忽。他们可能没有考虑到他们在问题中的定义可能会导致某些值在前两个 bin 中被计算两次。
  • gnovice 是正确的,我在表达我的问题时很草率,对此我深表歉意,第一次在这个板上......
【解决方案2】:

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

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

上面使用FLIPLR,所以xedges应该是行向量(即1×N)。此代码将根据以下标准对数据进行分箱:

  • 第一个 bin n(1) 计算与 edges(1) 匹配的 x 的任何值。
  • 其他 bin n(k)x(i) 的值进行计数,使得 edges(k-1) < x(i) <= edges(k)

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


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

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

  • 第一个 bin n(1) 计算与 edges(1) 匹配的 x 的任何值。
  • 第二个 bin n(2)x(i) 的值进行计数,使得 edges(1) < x(i) < edges(2)
  • 其他 bin 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) 的值的数量,被丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2010-12-03
    • 2014-08-25
    相关资源
    最近更新 更多