如何将依赖时间的值转换为上升,停留和下降?

时间:2015-10-23 06:46:35

标签: c# .net

我有一个像这样的数组

time_in_seconds;value
2.353463;0
2.453463;10
2.553463;10
2.653463;9
2.853463;0
3.353463;0
5.353463;2

我想用

填充List<Times>
public class Times
{
  public double[] time_rising_start {get;set;}
  public double[] time_rising_end {get;set;}
  public double[] time_staying_end {get;set;}
  public double[] time_falling_end {get;set;}
}

,其中

double[] time = new double[2];
time[0] = time_start
time[1] = time_start_value
分别

double[] time = new double[2];
time[0] = time_end
time[1] = time_end_value

有很多方法,我正在寻找一种智能的方法来将其概括为上升,停留和下降。这意味着

2.353463;0
2.453463;10

正在上升,0 - > 10

2.453463;10
2.553463;10

待在,10 - &gt; 10

2.553463;10
2.653463;9
2.853463;0

正在下降,10 - &gt; 9 - &gt; 0

2.853463;0
3.353463;0

停留,0 - &gt; 0

time_rising_starttime_falling_end应始终位于value = 0。在上面提到的例子中,它是

  time_rising_start = 2.353463;
  time_rising_end = 2.453463;
  time_staying_end = 2.553463;
  time_falling_end = 2.853463;

下一个对象

  time_rising_start = 3.353463;
  ...

它应该能够处理像value

这样的细微变化
0
10
11
10
11
12
7
3
0

应该等于

0 <- time_rising_start
10 <- time_rising_end
11
10
11
12 <- time_staying_end
7
3
0 <- time_falling_end

比较之前的值很容易。我会看它是否低于它上升等等。但由于这不是那么简单,我正在寻找一种有效的方法。

1 个答案:

答案 0 :(得分:3)

创建一组状态(例如枚举):InitialRisingFallingSteady

跟踪state和上次看到的值currentcurrent_time

在伪代码中:

state = Initial 
current = first value
current_time = first time

foreach (value,time) after first
 switch on the state
  case Initial:
    if (value > current_value) { ... output rising, state = Rising }
    else ...
    current = value
  case Rising:
    if (value > current_value) { // do nothing, still rising }
    ...

在处理每个值时,状态机需要决定是否需要更改状态以及是否输出某些内容。在某些州,某些值只会前进到下一个值。最后,您可能需要再输出一个值。

这是一个经典的状态机实现。有更高级的状态机(分层的)。每个开发人员都应该了解状态机的工作原理以及如何实现状态机,因为它们很常见。

UML State Machines是该主题的一个很好的参考。