2017-11-08 9 views
-2

私はarduinoを使用して256個の値を配列に格納するセンサーを読み取っています。私はローカルmaxを見つけることを試みているが、格納されているいくつかの値は、値が複数回印刷される原因となる値を左右に繰り返す。すべての真の値が最大値であることを意味する別の配列に格納して、繰り返し値を処理して1つの値に減らす方法はありますか?ローカル最大値を見つける方法

ORには最大値を繰り返しの値がちょうど1に減少する別の配列? OR IE:4以来

Array1[] = {1,2,3,4,4,4,3,2,7,8,9,10} 

max = 4 at index 3 
max = 4 at index 4 
max = 4 at index 5 

がピーク点であるが、専門家レベルで可能何もあれば、配列は

Array2[] = {1,2,3,4,3,2,7,8,9,10} 

max = 4 at index 3 

のように見える、私はそれを減らすことができますどのようにように繰り返され、私は、最も基本的な内訳を必要とします、ありがとう。アルドゥイーノから

コード:

int inp[20] = {24,100,13,155,154,157,156,140,14,175,158,102,169,160,190,100,200,164,143,20}; 
void setup() 
{ 
    Serial.begin(9600); // for debugging 
} 

void loop() 
{ 
    int i; 
    int count = 0; 
    for (i = 0; i < 20; i++) 
    { 
     Serial.println((String)inp[i]+" index at - "+i); 
     delay(100); 
    }; 

int N = 5; // loc max neighborhood size 
for (int i = N-1; i < 19-N; i++) 
    { 
     bool loc = false; 
     for (int j = 1; j < N; j++) // look N-1 back and N-1 ahead 
     { 
     if (inp[i] > inp[i-j] && inp[i] > inp[i+j]) loc = true; 
     } 
     if (loc == true) 
     {   
      Serial.println((String)"max = "inp[i]+" at index "+i); 
     } 
    } 
    Serial.println("----------------------------------"); 
} 
+1

ピークは最大ではなく、 1組のデータは複数のピークを含むことができる。つまり、一連のデータから重複を取り除くだけでは意味がありません。ただし、重複する値を印刷する必要はありません。だから、あなたがピークを見つけるたびに、それを保管してください。そして、同じピークに遭遇した場合は、無視してください(印刷しないでください)。 – DimChtz

+0

どうすれば保存できますか? – k5man001

+0

データ範囲は[0 255](256値)です。だから、サイズ256の別の配列を作成し、すべての要素を0に初期化し、ピーク時には常に適切な位置に配列を増やします。そうすれば、ピークを得るたびに、この位置で0であれば配列をチェックするだけです。はいの場合はピークを印刷し、無視する。 – DimChtz

答えて

2

あなたが別の配列に何かをコピーする必要がなく、単一のループで「極大値」またはピークを検出することができます。あなたは繰り返し値を無視するだけで、考慮している値が現在増減しているかどうかを追跡するだけで済みます。その後、このステータスが増加から減少に切り替わる各値はピークです。

int main() { 

    int Array1[] = {1,2,3,4,4,4,3,2,7,8,9,10}; 

    int prevVal = INT_MIN; 
    enum { 
     Ascending, 
     Descending 
    } direction = Ascending; 

    for (int i=0; i<sizeof(Array1)/sizeof(*Array1); i++) { 
     int curVal = Array1[i]; 
     if (prevVal < curVal) { // (still) ascending? 
      direction = Ascending; 
     } 
     else if (prevVal > curVal) { // (still) descending? 
      if (direction != Descending) { // starts descending? 
       cout << "peak at index " << i-1 << ": " << prevVal << endl; 
       direction = Descending; 
      } 
     } 
     // prevVal == curVal is simply ignored... 

     prevVal = curVal; 
    } 
} 
+0

これがArduinoで動作するなら、試してみてください。 – k5man001

+0

うまくいけば。たぶんあなたは構文を適応させる必要があるかもしれませんが、アプローチ自体はどの手続き型言語でも動作するはずです。 –

関連する問題