c# – RX:序列的有状态变换,例如指数移动平均线

c# – RX:序列的有状态变换,例如指数移动平均线,第1张

概述你怎么能在RX中做一个简单的,有状态序列变换? 假设我们想要对IObservable noisySequence进行指数移动平均变换. 每当noisySequence滴答时,emaSequence应该勾选并返回该值 (previousEmaSequenceValue *(1-lambda)latestNoisySequenceValue * lambda) 我猜我们使用的是主题,但究竟是怎么回事 你怎么能在RX中做一个简单的,有状态的序列变换?

假设我们想要对IObservable noisySequence进行指数移动平均变换.

每当noisySequence滴答时,emaSequence应该勾选并返回该值
(prevIoUsEmaSequenceValue *(1-lambda)latestNoisySequenceValue * lambda)

我猜我们使用的是主题,但究竟是怎么回事?

public static voID Main()    {        var rand = new Random();        IObservable<double> sequence  = Observable            .Interval(TimeSpan.FromMilliseconds(1000))            .Select(value => value + rand.NextDouble());        Func<double,double> addNoise = x => x + 10*(rand.NextDouble() - 0.5);        IObservable<double> noisySequence = sequence.Select(addNoise);        Subject<double> exponentialMovingAverage = new Subject<double>(); // ???         sequence.Subscribe(value => Console.Writeline("original sequence "+value));        noisySequence.Subscribe(value => Console.Writeline("noisy sequence " + value));        exponentialMovingAverage.Subscribe(value => Console.Writeline("ema sequence " + value));        Console.Readline();    }
解决方法 这是您可以将状态附加到序列的方法.在这种情况下,它计算最后10个值的平均值.
var movingAvg = noisySequence.Scan(new List<double>(),(buffer,value)=>{    buffer.Add(value);    if(buffer.Count>MaxSize)    {        buffer.RemoveAt(0);    }    return buffer;}).Select(buffer=>buffer.Average());

但你可以使用Window(这是一种泛化的方式)来获得你的平均值.

noisySequence.Window(10)   .Select(window=>window.Average())   .SelectMany(averageSequence=>averageSequence);
总结

以上是内存溢出为你收集整理的c# – RX:序列的有状态变换,例如指数移动平均线全部内容,希望文章能够帮你解决c# – RX:序列的有状态变换,例如指数移动平均线所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1263232.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存