反应式编程:如何使用Reactive.jl获得移动平均线

时间:2016-06-14 19:30:39

标签: julia reactive-programming

我想要一个输出 x 周期的移动平均值的信号/功能。我提出了两种方法,两种方法都有效,但我相信第二种方法更具反应性。有谁知道更好的方法?

方法1

@time (
x = Signal(100);

col = foldp(Int[], x) do acc, val
    push!(acc, val)
end;

for i in rand(90:110, 100)
    push!(x, i)
end;
)

此代码在 0.102663秒 中为我执行,并且很容易产生过去100个信号的平均值:mean(value(col))

方法2

@time (
a = Signal(100);

sar = Vector{Signal}(101);

sar[1] = a;

for i in 1:100
    sar[i+1] = previous(sar[i])
end;

for i in rand(90:110, 100)
    push!(a, i)
end;
)

此代码在 0.034911秒 中为我执行,并且还可以轻松地显示最近100个信号的平均值:

sarval = map(value, sar)
mean(sarval[2:end])`

上述两种方法均不直接提供输出信号;这里是方法1,用于创建指定长度的移动平均值作为连续信号:

方法1已应用

x = Signal(initial_value)

col = foldp(Float64[], x) do acc, elem
    push!(acc, elem)
end

macro moving_average(per, collec)
    quote
        map($collec) do arr
            length(arr) < $per ? mean(arr) : mean(arr[(end-$per+1):end])
        end
    end
end

ma_period = @moving_average(period_length, col)

此代码使用第一种方法生成所有过去信号的数组信号,其长度随信号数量线性增加。对于更新数千次的信号,这看起来很笨重(充其量)。这似乎并不理想,我正在寻找一些更好的方法。不确定如何采用方法2并将其转换为信号输出,并且不确定它是否是我能采取的最佳方法。

还有一个相关的问题:有一个很好的内置函数previous(signal),它在 signal 后面提供了一个信号滞后1更新。有没有办法在信号后面指定一个指定的,任意数量的更新的标志?

0 个答案:

没有答案