1

信号内のゼロ交差の数を計算するアルゴリズムを作成しました。これは、値が + から - に、またはその逆に変化する回数を意味します。

アルゴリズムは次のように説明されています。

以下の要素がある場合:

v1 = {90, -4, -3, 1, 3}

次に、その値にその隣の値を掛けます。(i * i+1)

次に、符号値 sign(val) を取得して、これが正か負かを判断します。例:

e1 = {90 * -4} = -360 -> sigum(e1) = -1 
e2 = {-4 * -3} =  12  -> signum(e2) = 1
e3 = {-3 *  1} =  -3  -> signum(e3) = -1
e4 = {1 *   3} =  3   -> signum(e4) = 1

したがって、負から正に変化した値の総数は = 2 ..

ここで、この一般的なアルゴリズムを方程式に入れて、提示できるようにしたいと思います。

私は似たような質問をしましたが、本当に混乱したので、立ち去って考え、思いつきました (方程式はどのように見えるべきだと思いますか).. それはおそらく間違っています、まあ、笑えるほど間違っています. しかし、ここにあります:

ここに画像の説明を入力

その背後にあるロジックは次のとおりです。

V (val) を渡します

(Vi * Vi+1) の計算から符号の合計の絶対値を取得します。符号 (Vi * Vi+1) は -1、1、...、値を生成する必要があります。

値が -1 の場合のみ (ゼロを超える回数だけに関心があるため、ゼロ値.

これは正しいように見えますか?そうでない場合、誰かが改善を提案できますか?

ありがとうございました :)!

編集:

ここに画像の説明を入力

これは今正しいですか?

4

1 に答える 1

2

あなたはここで正しいことをしていますが、負の場合に隣接する要素の積の符号を数えたいだけなので、方程式は間違っています. 正符号の積は無視する必要があるため、積の符号を合計しないでください。このため、隣接する要素間の正の積を無視する必要があるため、明示的な数式は扱いにくいものです。必要なのは、2 つの引数を取り、その積が負の場合は 1 に評価され、負でない場合は 0 に評価される関数です。

f(x,y) = 1 if xy < 0
       = 0 otherwise

次に、交差点の数は単純に次のように与えられます

sum(f(v1[i],v1[i+1])) for i = 0 to i = n-1 

nベクトル/配列の長さですv1(ゼロ インデックスに基づく C スタイルの配列アクセス表記を使用)。また、4 つの連続したポイント {-1,0,0,1} などのエッジ条件も考慮する必要があります。これを単に 1 つのゼロ クロスと見なしますか、それとも 2 と見なしますか? 問題の詳細に基づいてこれに答えることができるのはあなただけですが、あなたの答えが何であれ、それに応じてアルゴリズムを調整してください。

于 2012-11-22T00:17:40.010 に答える