【问题标题】:Matlab moving averageMatlab移动平均线
【发布时间】:2021-01-18 22:51:14
【问题描述】:

我试图创建一个名为moving_average.m 的函数,它有一个数组作为参数 任意长度,并从三个连续值计算移动平均值。结果应该返回一个数组。这是我当前的代码:

function [output] = moving_average(inputarray)
    sz = size(inputarray);
    output = zeros(sz);
    for i=1:sz
        output(i,:) = (inputarray(i) + inputarray(i+1) + inputarray(i+2))/3;
    end
    
end

现在,它只设置输出数组的第一个元素,其他元素为零。有人知道如何解决这个问题吗?

【问题讨论】:

  • 在函数中设置断点,然后运行函数。它会在断点处停止,让您检查变量的内容,并逐行执行函数。在您定义 sz 并检查其值之后,请执行此操作。这是你所期望的吗? 1:sz 的结果是什么?

标签: matlab filtering signal-processing


【解决方案1】:

size 函数的输出是一个 Nx1 数组,其中 N 是输入的维数。

inputarray = rand(1,20);
sz = size(inputarray)

输出:

sz =

    1     20

语句i = 1:sz 需要一个标量值。因此,Matlab 只查看sz 的第一个元素,对于 1xN 数组,它是 1。如果您使用 Nx1 行数组,它将运行 N 次,但随后您将收到错误 (Index exceeds array bounds.),因为它将尝试访问不存在的行 N+1 和 N+2。这就是您需要使用 for i=1:sz-2 的原因,如 Martin 所示。

length 函数等价于max(size(A))。这很方便,因为它可以无缝处理行向量和列向量。

【讨论】:

    【解决方案2】:

    因为您正在执行 3 点移动平均,for 循环正在尝试访问值 ii+1i+2,但它们不存在。这就是我将如何重写函数moving_average

    function [output] = moving_average(inputarray)
        len_z = length(inputarray);
        output = zeros(len_z-2,1);
        for i=1:len_z-2
            output(i) = (inputarray(i) + inputarray(i+1) + inputarray(i+2))/3;
        end
    
    end
    

    然后用以下方法测试它:

    X = rand(20,1);
    
    moving_average(X)
    

    我使用20x1 向量作为输入X,但它适用于任何nx11xnmoving_average(X) 的输出将是 (n-2)x1

    【讨论】:

    • 如果第一段是正确的,OP 会收到一条错误消息,但事实并非如此。仅设置输出的第一个元素。这个答案没有解释为什么。在您的代码中,您将 OP 的 size 替换为 length,这解决了 OP 的问题,但您没有解释为什么要进行此更改。您给出的解释解决了您在修复 OP 的问题后遇到的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2013-12-22
    • 1970-01-01
    • 2022-01-26
    • 2011-06-29
    • 2019-04-24
    相关资源
    最近更新 更多