查找未知连续循环的最小值和最大值

时间:2012-04-30 13:01:19

标签: c++ algorithm while-loop

我试图找到下面给出的连续while循环的最小值和最大值,但不知怎的,我无法得到正确的逻辑。请告诉我哪里出错了。

while (true)
   {
         Function(&RawX, &RawY, &RawZ);// Keeps generating new RawX,Y and Z values

         if(MaxRawX < RawX)
            MaxRawX = RawX;
         if(MinRawX > RawX)
            MinRawX = RawX;

         Output("MaxRawX:%0.2f",MaxRawX);
   }

我面对上述算法的问题是RawX,RawY和RawZ的值不断变化。例如:在某一点上,我的值范围为-46到-35。我希望我的程序将MinRawX显示为-46,将MaxRawX显示为-35。在某些其他方面,我可能在201到215之间有值,我希望它将MaxRawX显示为215,将MinRawX显示为201.它基本上是我从硬件接收的一些传感器角度数据。我确信我在这里做错了,因为这是非常基本的,但无法弄清楚。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

如果我理解正确,您希望在给定时间范围内具有最小和最大 。您使用的解决方案保持自程序开始以来的最小值和最大值。

根据您的需要,您有多种解决方案:例如,您可以随时重置最小值和最大值,例如@dirkgently建议。如果你想要一个移动范围,那么在任何时候你都有n最后一次测量的最小值和最大值,那么你将不得不使用更复杂的解决方案。我唯一能想到的就是将测量值保存在FIFO容器中:

std::deque<int> lastRawXs;
const int frameSize = 100; // only keep the last 100 measures    

while (true)
{
    // Keeps generating new RawX,Y and Z values
    Function(&RawX, &RawY, &RawZ);// 

    if (lastRawXs.size() >= frameSize)
    {
        lastRawXs.pop_front();
    }
    lastRawXs.push_back(RawX);

    typedef std::deque<int>::const_iterator iterator;
    std::pair<iterator, iterator> minMaxRawX =
        boost::minmax_element(lastRawXs.begin(), lastRawXs.end());

    Output("MinRawX:%0.2f", *minMaxRawX.first);
    Output("MaxRawX:%0.2f", *minMaxRawX.second);
}

修改:以下是使用circular buffer的替代(更好)解决方案:

const int frameSize = 100;
std::circular_buffer<int> lastRawXs(frameSize);

while (true)
{
    Function(&RawX, &RawY, &RawZ); // keeps generating new RawX,Y and Z values

    lastRawXs.push_back(RawX); // overwrites old measures if buffer is full

    typedef std::circular_buffer<int>::const_iterator iterator;
    std::pair<iterator, iterator> minMaxRawX =
        boost::minmax_element(lastRawXs.begin(), lastRawXs.end());

    Output("MinRawX:%0.2f", *minMaxRawX.first);
    Output("MaxRawX:%0.2f", *minMaxRawX.second);
}

答案 1 :(得分:2)

您似乎只需要最近最大/最小值,因此您可以执行以下操作:

const int MAX_AGE = 1000; // number of samples before min/max expires
int MinRawXAge = INT_MAX;
int MaxRawXAge = INT_MAX;

while (true)
{
    if (MinRawXAge > MAX_AGE) // test to see whether MinRawX has expired
    {
        MinRawX = INT_MAX;
        MinRawXAge = 0;
    }

    if (MaxRawXAge > MAX_AGE) // test to see whether MaxRawX has expired
    {
        MaxRawX = INT_MIN;
        MaxRawXAge = 0;
    }

    Function(&RawX, &RawY, &RawZ); // Keeps generating new RawX, Y and Z values

    if (MaxRawX < RawX) // test for new MaxRawX
    {
        MaxRawX = RawX;
        MaxRawXAge = 0;
    }
    else
    {
        MaxRawAge++;
    }

    if (MinRawX > RawX) // test for new MinRawX
    {
        MinRawX = RawX;
        MinRawXAge = 0;
    }
    else
    {
        MinRawAge++;
    }

    Output("MinRawX: %0.2f, MaxRawX: %0.2f", MinRawX, MaxRawX);
}

跟踪最小值和最大值的 age (样本中),当它们超过预定阈值(在上述情况下为1000个样本)时,它们“到期”并被更多最近的最小/最大值。

答案 2 :(得分:1)

嗯,您的规格可能有问题。

您的代码将持续打印当前最大值。但是从您的描述来看,您实际上并不想要最大值。那你想要什么?

在开始编写代码之前,您需要正确的规范。