如何在matlab中有效地对数据进行分类

how to efficiently bin data in matlab

我想根据一些 'steps' 对一些数据进行分箱,这里 1:10。所以 bin{1} 应该包含值 >=steps(1) & <steps(2)

我想知道我是否可以从社区获得一些 tips/feedback,提出一个问题:是否有一些我尚未找到的分箱数据的常见做法,代码是否可以改进效率和可读性方面?

data=abs(sin(0:.1:10)*10); %example data
steps=1:10; %user-defined bins
betw=@(x,mi,ma) x(x>=mi & x<ma); %function that returns values between minimum/maximum

bin={};
for ind=1:numel(steps)-1
  bin{ind}=betw(data,steps(ind),steps(ind+1));
end
bin

bin =

  1×9 cell array

  Columns 1 through 7

    {1×7 double}    {1×7 double}    {1×7 double}    {1×8 double}    {1×9 double}    {1×7 double}    {1×10 double}

  Columns 8 through 9

    {1×11 double}    {1×27 double}

histcounts 函数将是 "standard" 执行此操作的方法:

data = abs(sin(0:.1:10)*10); %example data
steps = 1:10;                %user-defined bins

hc = histcounts( data, steps );
>> hc = 
  [ 7 7 7 8 9 7 10 11 27 ]

请注意,hcsteps 小一个元素,因为 steps 定义了 bin 边缘。总计数 sum(hc) 等于 data 中落在最低和最高 bin 之间的元素数 - 在这种情况下少于 numel(data) 因为 data 的一些元素是比 steps.

中的最低分箱值低

histcounts 到 return bin 边缘有很多选项,指定 bin 的数量而不是边缘,return 每个元素的 bin 编号,等等...

如果您真正想要的只是条形图(在您的评论中注明),您可以使用 histogram,它会在后台调用 histcounts 进行计算,但会输出一个数字也是。

histogram( data, steps );