3

以下に示す連続 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 として表示したい場合があります。基本的には、ハードウェアから受け取ったセンサー角度データです。これは非常に基本的なことですが、理解できないことを考えると、ここで何か間違ったことをしていると確信しています。助言がありますか?

4

3 に答える 3

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);
}

編集:循環バッファを使用した代替(より良い)ソリューションは次のとおりです:

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);
}
于 2012-04-30T13:20:45.277 に答える
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);
}

これは、最小値と最大値の経過時間(サンプル)を追跡し、それらが所定のしきい値(上記の場合は1000サンプル)を超えると、「期限切れ」になり、より新しい最小/最大値に置き換えられます。

于 2012-04-30T13:21:04.963 に答える
1

まあ、おそらくあなたの仕様に問題があります。

コードは現在の最大値を継続的に出力します。しかし、あなたの説明から、実際には最大値が必要ないようです。じゃ、何が欲しいの?

コードを書き始める前に、正しい仕様が必要です。

于 2012-04-30T13:09:37.193 に答える