如何在Octave中以直方图展示矩阵中整数的出现频率?
解决Octave中负二项分布直方图整数对齐问题
你的核心问题是Octave默认的hist()函数会自动划分不等宽的bins,无法匹配整数型的抛掷次数数据。要让直方图每个整数对应宽度为1的bin且精准对齐,只需手动指定bins的范围,让每个bin恰好包含一个整数的取值区间。
修改步骤:
- 计算数据的最小和最大值,生成覆盖所有整数的bins数组,每个bin的区间为
[k-0.5, k+0.5)(k为整数),确保每个整数被单独统计。 - 将
hist(B)替换为指定bins的调用。 - 修正ylabel表述(原"Percentage of Sucess"不符合你要展示的次数统计需求)。
修改后的完整代码:
A = zeros(1,100); headsCounter = 0; success = 4; tries = 0; ii = 2; largestTries = 0; while(ii <= length(A)) while (headsCounter < success) X = rand; if(X > 0.5) headsCounter = headsCounter + 1; end tries = tries + 1; end A(ii) = tries; if(A(ii-1) < tries) largestTries = tries; end headsCounter = 0; tries = 0; ii = ii+1; end B = A(2:length(A)); % 手动生成对齐整数的bins bins = min(B)-0.5 : 1 : max(B)+0.5; hist(B, bins); xlabel("Number of Tosses"); ylabel("Number of Experiments"); % 改为次数统计,匹配你的示例需求 title("Negative Binomial Distribution (4 Heads Required)");
额外优化建议:
你提到for循环报错,Octave的for循环标准语法为for ii=1:length(A),可以替换while循环让代码更简洁:
A = zeros(1,100); success = 4; for ii=1:length(A) headsCounter = 0; tries = 0; while (headsCounter < success) X = rand; if(X > 0.5) headsCounter = headsCounter + 1; end tries = tries + 1; end A(ii) = tries; end B = A;
内容的提问来源于stack exchange,提问作者Nicholas Nelson
相关产品推荐
相关产品推荐

