Octave实现相邻值平均序列平滑(非经典移动平均)方法咨询
问题解答
计算类型判定
- 该计算同时属于2点无加权简单移动平均和基础平滑函数范畴:移动平均是最常用的时序平滑实现手段之一,你提出的计算逻辑是窗口长度为2的移动平均的标准实现,本身就属于平滑处理的子类。
Octave 实现思路
1. 针对2点平均的最简向量化实现
不需要依赖任何额外包,直接用索引操作即可,性能最高:
% 输入v为列向量 o = (v(1:end-1) + v(2:end)) ./ 2;
带入你给出的示例v = [1;3;5;3;9;9]计算,输出结果正好为[2;4;4;6;9],完全匹配需求。
2. 通用移动平均实现(适配任意窗口长度)
如果后续需要扩展为更长窗口的平滑计算,可以直接用Octave内置的conv卷积函数实现:
% 2点移动平均实现,和需求结果一致 o = conv(v, [0.5, 0.5], 'valid');
其中'valid'参数指定返回无边缘填充的计算结果,仅保留窗口完全覆盖输入向量的计算值。如果需要修改为N点平均,只需要把卷积核改为对应长度的等权重向量即可,比如3点平均的卷积核为ones(1,3)/3。
3. 类Matlab smooth函数封装
你可以直接封装一个通用平滑函数满足日常使用,示例如下:
function o = simple_smooth(v, window_len) % 简单移动平均实现,适配列向量输入 % 输入参数: % v: 输入待平滑向量 % window_len: 移动窗口长度,默认值为2 % 输出参数: % o: 平滑后向量,长度为 length(v) - window_len + 1 if nargin < 2 window_len = 2; end kernel = ones(window_len, 1) / window_len; o = conv(v, kernel, 'valid'); end
调用示例:
v = [1;3;5;3;9;9]; % 调用默认2点平滑,输出为[2;4;4;6;9] res = simple_smooth(v); % 调用3点平滑,输出为[3; 11/3; 17/3; 7] res_3win = simple_smooth(v, 3);
内容的提问来源于stack exchange,提问作者ralfiii
相关产品推荐
相关产品推荐

