我多次遇到的一个问题是想要获取两个相似的数据集并从中创建直方图,其中二进制文件是相同的,以便轻松计算直方图重叠等内容。
您可以使用
定义容器的数量(显然)[counts, bins] = hist(data,number_of_bins)
但是,对于几个不同的数据集,没有明显的方法(据我所知)使bin大小相等。如果记得我最初看起来找到了似乎有同样问题的各种人,但没有好的解决方案。
答案 0 :(得分:0)
正如horchler所指出的,使用histc
(可以让你定义你的箱子矢量)或将你的直方图输入矢量化为hist
很容易实现。
我离开下面是为了提醒别人,即使是愚蠢的问题也能产生有价值的答案
我一直在使用以下方法,所以认为它可能对其他人有用(或者,有人可以非常快地指出正确的方法来执行此操作!)。
一般方法依赖于MATLAB
' hist
函数定义样本中最大值和最小值之间的等间隔数量的二进制数。因此,如果您将各个样本的开始(最小)和结束(最大)值附加到所有感兴趣的样本的最小值和最大值,这会强制所有您的所有样本的直方图范围相等数据集。然后,您可以截断第一个和最后一个值以重新创建原始数据。
例如,创建以下数据集
A = randn(1,2000)+7
B = randn(1,2000)+9
[counts_A, bins_A] = hist(A, 500);
[counts_B, bins_B] = hist(B, 500);
对于我的特定数据集,我得到以下结果
bins_A(1) % 3.8127 (this is also min(A) )
bins_A(500) % 10.3081 (this is also max(A) )
bins_B(1) % 5.6310 (this is also min(B) )
bins_B(500) % 13.0254 (this is also max(B) )
要创建相等的分档,您只需先定义一个小于两个范围的最小值和最大值;
topval = max([max(A) max(B)])+0.05;
bottomval = min([min(A) min(B)])-0.05;
0.05
的加/减是基于对值范围的了解 - 您不希望额外的bin太远或太接近实际范围。话虽这么说,对于这个例子,通过使用联合最小/最大值,无论生成的A和B值如何,此代码都将起作用。
现在我们使用重新创建直方图计数和分档(注意额外的2个分箱是我们新的最大值和最小值)
[counts_Ae, bins_Ae] = hist([bottomval, A, topval], 502);
[counts_Be, bins_Be] = hist([bottomval, B, topval], 502);
最后,您截断第一个和最后一个bin和value条目以完全重新创建原始样本
bins_A = bins_Ae(2:501)
bins_B = bins_Ae(2:501)
counts_A = counts_Ae(2:501)
counts_B = counts_Be(2:501)
现在
bins_A(1) % 3.7655
bins_A(500) % 13.0735
bins_B(1) % 3.7655
bins_B(500) % 13.0735
从此可以轻松地再次绘制两个直方图
bar([bins_A;bins_B]', [counts_A;counts_B]')
并且还可以轻松地绘制直方图重叠
bar(bins_A,(counts_A+counts_B)-(abs(counts_A-counts_B)))