基于另一个Rx可观察对象上采样



我是响应式扩展的新手,所以请原谅我的无知。我有两个可观察对象obj1obj2,它们返回项。在一个特定的时间窗口T(我想是缓冲区)中,我想对最稀疏的项目序列进行上采样。请看,一个示意图示例。

            Time of returned objects   
        obj1   t1  t2 t3 t4 t5 t6 ...   
        obj2  t1         t2       t3 ...
     os_obj2   t1  t1 t2 t2 t2 t3 ...   
 time_window <-----T-----><-----T----->

在上采样过程中,我们将obj2的返回项放置在obj1的返回项存在的相同位置(时间)。

在特定的obj1项目时间上复制哪个obj2项目取决于哪个obj2项目更接近特定的obj1项目时间。

你能建议一种方法(可能的函数,或函数的管道)来实现吗?

谢谢。

EDIT我刚刚注意到您想要发出以前任何其他可观察对象都没有发出的项。这是不可能实现的,因为它需要预见未来。

如果obj2定期发出可预测的项,那么您可以做一些事情。让obj2提前半个周期发出这些项目,这样你就可以只使用obj2的最新项目,而不需要预测未来的项目。

下面的示例将在obj1的发射时间发射obj2的最新项。最简单的是使用Observable.withLatestFrom

var obj1 = Rx.Observable.interval(500).map(x => "obj1." + x).take(10);
var obj2 = Rx.Observable.interval(300).map(x => "obj2." + x).take(10);
obj2.withLatestFrom(obj1).pluck(1).subscribe(x => console.log(x));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-beta.11/Rx.umd.js"></script>

PS:起初我认为sample可以使用,但它不适合我的过采样。

可观察流中的每个值都有两个元素:它出现的时间和值。让我们稍微修改一下示意图:

Timeline  0--1--2--3--4--5--6--7--8...
XObserve  x0-x1-x2-x3-x4-x5-x6-x7-x8...
YObserve  y0-------y1-------y2------...

所以我们有两个可观察对象,一个每秒发出一个值(为简单起见,我们设时间轴是秒刻度),另一个每三秒发出一个值。考虑到所有这些,您是否希望第三个流ZObserve使用上采样技术以X流的速率为Y流生成值,就像这样?

Timeline  0--1--2--3--4--5--6--7--8-...
XObserve  x0-x1-x2-x3-x4-x5-x6-x7-x8...
YObserve  y0-------y1-------y2------...
ZObserve  y0-y0-y1-y1-y1-y2-y2-y2-??...

你可以看到T8ZObserve的值是??,因为我不知道它是什么。我也不知道在T2T5我怎么能预测Y流的下一个值是什么。如果它们是什么有可靠的规则,那么我们可以相应地编码,生成一个新的流PredictedY,并使用WithLatestFrom作为@Tamas建议的生成Z流。

我建议使用Operator combinellatest并可能在之后使用Sample

相关内容

  • 没有找到相关文章

最新更新