移动平均函数matlab(不使用for循环)

时间:2015-05-12 08:18:17

标签: matlab variables persistent moving-average

我正在尝试使用以下问题完成一个matlab分配项目:

编写一个名为moving_average的函数,它将一个名为x的标量作为输入参数并返回一个标量。该函数使用“缓冲区”来保存先前的输入,缓冲区最多可以容纳25个输入。具体来说,该函数必须将最近的25个输入保存在向量(缓冲区)中。每次调用该函数时,它都会将输入参数复制到缓冲区的元素中。如果缓冲区中已存储了25个输入,则会丢弃最旧的元素并将当前元素保存在缓冲区中。将输入存储在缓冲区后,它返回缓冲区中所有元素的平均值。

我提供的解决方案如下:

function ma = moving_average (x)
    persistent buffer;
    if isempty(buffer)
        buffer = x; ma = mean(x);
    else buffer = [buffer x];
        if numel(buffer) <= 25
            ma = mean(buffer); 
        else
            ma = mean([buffer(end-24) buffer(end)]);
        end
    end

根据自动分级器,我的功能在值1-50连续通过时正确执行,但在连续通过嘈杂正弦波的值时失败(我已被告知可能是由于某种类型的回合误差)。

如果你们中的任何人能够提供关于我的代码中可能的错误步骤的一些提示(上面附加),我将不胜感激。

提前谢谢

1 个答案:

答案 0 :(得分:4)

你只是对最后一次和最后一次的第25次进行平均。

使用:

ma = mean(buffer(end-24:end));

评论您的代码: 如果不经常调用您的函数,它将表现良好。但是,如果多次调用该函数,您的buffer将变得越来越大。这可能是内存泄漏。您应该考虑只在缓冲区中保留25个值:

if length(buffer) > 25
   buffer = buffer(end-24:end);
end