【问题标题】:Dividing a range into bins in matlab在matlab中将范围划分为bin
【发布时间】:2011-12-16 05:42:29
【问题描述】:

我从一个更大的矩阵中得到以下范围:

范围(a)

ans =

94   153   144    59    79    90   131    64

我的教授要求我们:将范围划分为 N = 10 个等长段(以下称为“bins”),并为每个 bin 找到它的边界 (aj, bj) 以及它的中心 cj。

(5)将每个测量的细菌计数xi放入下限小于等于xi且上限大于xi的bin中;此后,为每个 bin 计算分配给它的 xi 的数量(= nj)。

(6) 使用 N = 10 条绘制测量的细菌计数的直方图。 试试 MATLAB 函数 hist(x,N) 和 bar(c, n)

我知道这很多,但我绝对没有这个人的指示,非常感谢你的帮助:)

【问题讨论】:

标签: matlab range histogram bins


【解决方案1】:

考虑以下示例,它应该可以解决您的所有问题:

%# random data vector of integers
M = randi([50 200], [100 1]);

%# compute bins
nbins = 10;
binEdges = linspace(min(M),max(M),nbins+1);
aj = binEdges(1:end-1);     %# bins lower edge
bj = binEdges(2:end);       %# bins upper edge
cj = ( aj + bj ) ./ 2;      %# bins center

%# assign values to bins
[~,binIdx] = histc(M, [binEdges(1:end-1) Inf]);

%# count number of values in each bin
nj = accumarray(binIdx, 1, [nbins 1], @sum);

%# plot histogram
bar(cj,nj,'hist')
set(gca, 'XTick',binEdges, 'XLim',[binEdges(1) binEdges(end)])
xlabel('Bins'), ylabel('Counts'), title('histogram of measured bacterial')

请注意,这会正确处理最后一个 bin(阅读此 related question 以了解有关这些边缘情况的讨论)

【讨论】:

  • 它给了我一个错误,上面写着:???使用 ==> accumarray 时出错 第三个输入 SZ 必须是一个完整的行向量,SUBS 的每一列都有一个元素。 ==> EE300Project1 在 29 处出错 nj = accumarray(binIdx, 1, [nbins ], @sum);
  • @patrick.belon:在我看来,您在其中缺少1nj = accumarray(binIdx, 1, [nbins 1], @sum);。这也可以简化为:nj = accumarray(binIdx, 1);
  • @patrick.belon:您应该编辑您的问题并发布您正在使用的代码。我怀疑你做错了什么,因为我上面的例子工作得很好......
  • @Amro,感谢您提供的示例。似乎该代码仅适用于正整数,对吗?如果我们的数据中有0's(即min(M)==0)怎么办?
  • @Tin:不,它应该适用于任何数字向量(正/负,整数/浮点数)。向量中的0 值没有任何不同的处理方式..
【解决方案2】:

计算直方图:

range = [94   153   144    59    79    90   131    64]
[n,xout] = hist(range, 10)

xout 是 bin 中心,n 是 bin 计数。

绘制条形图:

 bar(xout,n)

计算 bin 边缘:

width = xout(2)-xout(1)
xoutmin = xout-width/2
xoutmax = xout+width/2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多