我试图找到下面给出的连续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.它基本上是我从硬件接收的一些传感器角度数据。我确信我在这里做错了,因为这是非常基本的,但无法弄清楚。有什么建议吗?
答案 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)
嗯,您的规格可能有问题。
您的代码将持续打印当前最大值。但是从您的描述来看,您实际上并不想要最大值。那你想要什么?
在开始编写代码之前,您需要正确的规范。