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

Julia 反应式编程:如何使用Reactive.jl获得移动平均线,julia,reactive-programming,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个信号的平均值:

我想有一个信号/功能,输出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)
x=信号(初始值)
col=foldp(Float64[],x)do acc,elem
推(行政协调会,要素)
结束
宏观移动平均值(单位,集合)
引用
地图($collec)do arr
长度(arr)<$per?平均值(arr):平均值(arr[(结束-$per+1):结束])
结束
结束
结束
平均周期=@移动平均(周期长度,列)
该代码使用第一种方法生成所有过去信号的阵列信号,其长度随信号数量线性增加。对于更新数千次的信号来说,这似乎很难处理(充其量)。这似乎并不理想,我正在寻找一些更好的方法。不确定如何采用方法2并将其转换为信号输出,也不确定这是否是我可以采用的最佳方法

还有一个相关问题:有一个很好的内置函数
previous(signal)
,它提供了一个滞后于更新信号的信号。有没有一种方法可以指定一个signsl,该signsl在信号后面包含指定的、任意数量的更新