移动平均函数 matlab(不使用 for 循环)
moving average function matlab (without the use of a for loop)
我正在尝试完成带有以下问题的 matlab 作业项目:
编写一个名为 moving_average 的函数,它将一个名为 x 的标量作为输入参数,returns 一个标量。该函数使用一个“缓冲区”来保存以前的输入,缓冲区最多可以保存 25 个输入。具体来说,该函数必须将最近的 25 个输入保存在一个向量(缓冲区)中。每次调用该函数时,它都会将输入参数复制到缓冲区的一个元素中。如果缓冲区中已经存储了 25 个输入,它会丢弃最旧的元素并将当前元素保存在缓冲区中。将输入存储到缓冲区后,returns 缓冲区中所有元素的平均值。
我提供的解决方案如下:
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 连续通过时正确执行,但在噪声正弦波的值连续通过时失败(我被告知这可能是由于某种舍入误差)。
如果你们中的任何人能给我一些关于我的代码中可能的错误步骤的提示(附在上面),我将不胜感激。
提前致谢
您只计算最后一个和倒数第 25 个的平均值。
使用:
ma = mean(buffer(end-24:end));
评论你的代码:
如果您的函数不经常被调用,它会表现良好。但是,如果该函数被多次调用,您的 buffer
会变得越来越大。这是可能的内存泄漏。您应该考虑在缓冲区中只保留 25 个值:
if length(buffer) > 25
buffer = buffer(end-24:end);
end
我正在尝试完成带有以下问题的 matlab 作业项目:
编写一个名为 moving_average 的函数,它将一个名为 x 的标量作为输入参数,returns 一个标量。该函数使用一个“缓冲区”来保存以前的输入,缓冲区最多可以保存 25 个输入。具体来说,该函数必须将最近的 25 个输入保存在一个向量(缓冲区)中。每次调用该函数时,它都会将输入参数复制到缓冲区的一个元素中。如果缓冲区中已经存储了 25 个输入,它会丢弃最旧的元素并将当前元素保存在缓冲区中。将输入存储到缓冲区后,returns 缓冲区中所有元素的平均值。
我提供的解决方案如下:
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 连续通过时正确执行,但在噪声正弦波的值连续通过时失败(我被告知这可能是由于某种舍入误差)。
如果你们中的任何人能给我一些关于我的代码中可能的错误步骤的提示(附在上面),我将不胜感激。
提前致谢
您只计算最后一个和倒数第 25 个的平均值。
使用:
ma = mean(buffer(end-24:end));
评论你的代码:
如果您的函数不经常被调用,它会表现良好。但是,如果该函数被多次调用,您的 buffer
会变得越来越大。这是可能的内存泄漏。您应该考虑在缓冲区中只保留 25 个值:
if length(buffer) > 25
buffer = buffer(end-24:end);
end