You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Octave中为1到n整数数据生成单值对应柱状直方图的问题

Octave 生成整数数据直方图的正确方法

我需要为取值在1到n之间的整数数据集生成直方图,要求每个整数对应一个独立的柱状条。但尝试将柱状条数量设为整数个数的方法并不生效:

octave:113> [nn,xx]=hist(p,max(p));
octave:114> [min(p) max(p)]
ans =

    1   15

octave:115> [min(xx) max(xx)]
ans =

    1.4667   14.5333

尽管size(xx)符合预期为15,且sum(xx)与唯一整数值的总和一致,但xx的取值并非整数本身。我理解hist函数原本是为连续实数据设计的,核心关注柱状条的边界划分,我的使用场景并不在它的设计目标范围内。

我尝试过用以下代码近似实现需求:

bar(1:max(p),histc(p,(unique(p))))

但如果数据p中存在某个中间整数出现次数为0的情况,这段代码会出现严重问题。


解决方法

要确保每个整数(包括出现次数为0的)都对应一个柱状条,需要先明确完整的整数范围,再统计每个整数的出现次数:

方法一:基于histc的直接实现

% 定义完整的整数取值范围(从1到数据中的最大值)
x_axis = 1:max(p);
% 统计每个整数的出现次数
counts = histc(p, x_axis);
% 绘制直方图,每个整数对应一个柱状条
bar(x_axis, counts);

这段代码会自动为1到max(p)之间的所有整数分配位置,即使某个整数出现次数为0,也会显示高度为0的柱状条。

方法二:使用tabulate函数补全数据

tabulate函数会直接返回数据中每个唯一值的出现次数,我们可以基于此补全缺失的整数:

% 获取数据的计数统计表
stats = tabulate(p);
% 生成完整的整数范围
full_x = 1:max(p);
% 初始化计数数组,默认所有值为0
full_counts = zeros(size(full_x));

% 将已有统计值匹配到完整范围中
for i = 1:size(stats, 1)
    idx = find(full_x == stats(i, 1));
    if ~isempty(idx)
        full_counts(idx) = stats(i, 2);
    end
end

% 绘制直方图
bar(full_x, full_counts);

内容的提问来源于stack exchange,提问作者צ�</think_never_used_51bce0c785ca2f68081bfa7d91973934>

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:41:02