正确、简单的方法
正如 horchler 所指出的,这可以很容易地使用histc(它允许您定义您的 bin 向量)或将您的直方图输入向量化为 hist 来实现。
错误,愚蠢的方式
我在下面留下来提醒其他人,即使是愚蠢的问题也能产生有价值的答案
我已经使用以下方法一段时间了,所以认为它可能对其他人有用(或者,有人可以很快指出正确的方法!)。
一般方法依赖于 MATLAB 的 hist 函数在样本中的最大值和最小值之间定义等间距的 bin 数量这一事实。因此,如果您将一个开始(最小)和结束(最大)值附加到您的各种样本,这是 所有 感兴趣样本的最小值和最大值,这会强制直方图范围对于您的所有数据集。然后,您可以截断第一个和最后一个值以重新创建原始数据。
例如,创建如下数据集
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 值如何工作。
现在我们重新创建直方图计数和 bin 使用(注意额外的 2 个 bin 用于我们新的最大值和最小值)
[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)))