是否可以预先计算(缓存)两个信号的差异值的聚合(最小值/最大值/平均值)?
我有几个通道(例如50个),每秒一个或多个测量值,我可以轻松存储预先计算的1分钟或15分钟聚合,以便更快地显示。
但其中一个要求是显示相对值的图表。例如。如果我有频道C1
,C2
和C3
,则用户希望看到C1
的平均值和(C2 - C3)
的平均值(或最少15分钟/最大值)在另一张图表上。
例如,假设我有这两个频道(还有48个频道):
t(min) 0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10
C1 0.0 0.1 0.2 -0.1 0.0 0.1 0.3 0.5 0.7 0.9 0.2
C2 0.1 0.4 0.2 0.1 -0.1 0.5 0.6 0.1 0.2 0.3 0.0
我可以预先计算并存储5分钟的聚合:
t(min) 0 to +4 +5 to +10
C1_min -0.1 0.1
C1_max 0.2 0.9
C2_min -0.1 0.0
C2_max 0.4 0.6
很容易从中获得10分钟或15分钟的聚合。
但是,如果用户希望看到min(C2-C1)
或max(C2-C1)
5分钟聚合,则对于这50个频道的任意组合,我似乎无法重复使用此信息。
换句话说,在我看来除了存储这些元组的每个可能组合之外,不可能预先计算这个元组,因为min(C2-C3)
不等于min(C2)-min(C3)
。
我错过了一些可能有助于我更快地计算这些值的想法吗?
答案 0 :(得分:1)
您只需拥有C2
和C3
的所有数据即可获得汇总min(C2-C3)
。
但是,如果您的目标是最小化执行此计算所需的数据,我建议您按以下方式执行此操作(此解决方案将需要处理大数字 - 取决于通道数量):
如果您知道所有频道的值都不会超过某个值(让我们说10
),那么我们可以将所有频道组合在一起。 1个频道中的数据,我们将其命名为C
计算C
:
C = (C1 * 10^1) + (C2 * 10^2) + (C3 * 10^3) + .. + (Cn * 10^n).
您最终会拥有一个包含所有通道值的频道C
。
然后在某个时刻计算2个频道之间的差异,你所要做的就是提取"提取"来自C
的2个频道值:
C1 = floor((C mod 10^1) / 10^(1-p)) / 10^p
C2 = floor((C mod 10^2) / 10^(2-p)) / 10^p
...
Cn = floor((C mod 10^n) / 10^(n-p)) / 10^p
其中p
是提取的通道值的小数精度。
在这种情况下,使用预先计算的x
计算两个频道y
和C
之间的差异将是:
min(Cy-Cx) = min((floor((C mod 10^y) / 10^(y-p)) / 10^p) - (floor((C mod 10^x) / 10^(x-p)) / 10^p))
然后您可以在一段时间内聚合这些值。希望它有所帮助。