1

値の配列が与えられた場合、それが増加する配列か減少する配列かを判断したいと思います。もちろん、単調な増加/減少のみを検出したい場合、これは簡単です。しかし、次のような配列がある場合:

3、3.2、3.4、3.3、3.4、3.7、4.2、4.8

これは確かに増加する配列ですが、i=3 の場合は 3.3<3.4 であるため、単調ではありません。

また、角度を操作している可能性があり、複数の円を完成させることができるため、最初と最後のインデックス間の単一のチェックはオプションではありません。

270°、290°、315°、345°、5°

5°<270°にもかかわらず、時計回りも増加していると思います

また、0 から 360 ではなく 0 から 180 までの角度を定義し、次に -180 から 0 までの角度を定義すると、これも問題になります。

170°、175°、180°、-175°、-170°がまた増えてきました。

これを C++ 用に書きたいのですが、重要なのは使用するアルゴリズムです。何か案が?

4

2 に答える 2

7

線形回帰を使用します。結果の勾配に基づいて、増加しているか減少しているかを判断できます。

ウィキペディアからの線形回帰の例

周期的なケースについては、「負の」要素をリストの前に移動してからテストを行うだけです...

注:5 4 3 2 1 1000このような特殊なケースでは、増加していることがわかりますが、「増加」の定義は非常にあいまいであるため、質問に正確に答えることは困難です。(おかしな値を除外したい場合がありますか?)

別の簡単なアプローチは、隣接する要素間の増加と減少の数を数えることですが、この場合10 11 12 13 14 0 1 2 3 4は明らかに増加しています (これは正しい答えかもしれませんが、わかりにくい..)

あなたが達成しようとしていることをもっと知らなければ、良い答えを出すのは難しい.

于 2012-04-23T13:47:00.587 に答える
0

Python での例を次に示します。

def angles_are_increasing(a):
    first=a[0]
    value=first
    previous=first
    for current in a:
        delta=current-previous
        if delta<180:
            delta+=360
        elif delta>180:
            delta-=360
        value+=delta
        previous=current
    last=value
    return last>first

アイデアは、345,5 を 345,365 として扱うなど、角度が戻ってきたときにジャンプを滑らかにすることです。これを実行すると、最終値と最初の値を比較して、値が全体的に増加しているかどうかを確認できます。

于 2012-04-23T13:43:05.847 に答える