0

次のようなコードを作成しようとしています: v が負から正にゼロを横切ったときの時系列では、これは他のゼロクロッシング (左右方向) から少なくとも 4 日離れていました。右に 8 つの要素 (ゼロクロッシングから) を取ると、少なくとも 80% の日が正であり、(ゼロクロッシングから) 左に 6 つの要素を取ると、少なくとも 60% の日が負でした. これらの条件を満たすシリーズは、ブックマークされるか、位置とともに保存されます。

ご協力いただきありがとうございます..

v=[-1 2 3 -9 -8 -6 -7 -9 -3 -2 -5 -6 -3 1 6 8 5 9 7 4 5 6 -5 -7 2 5 3 2 -2 -1 -5 -4 1 4 3 5 6 3  4 3 -4 5]

このプログラムを使用すると、値が正から負に、またはその逆に変化したときの位置を抽出できます。

vexample=v;
vexample(vexample >= 0) = 1;
vexample(vexample < 0) = -1; 
z = vexample > 0;
id = find([true;diff(vexample.') ~= 0]);
k = diff([id;numel(vexample)+1]);
out = -k; 
out(z(id)) = k(z(id));
clear id k vexample z

out = -1 2 -10 9 -2 4 -4 8 -1 1

そして今、条件を満たすシリーズの部分を検出しようとしていますが、それには問題があります

4

2 に答える 2

2

正直なところ、あなたは自分自身とこの質問の読者を必要以上に混乱させていると思います。上記のコードから MATLAB に習熟しているように見えるので、私の答えは部分的に分解することです。

最初にゼロクロッシングのすべてのインデックスを見つけます (それが id だと思いますか?)

これで、簡単にして、互いに 4 以内のインデックスを削除できます。for ループと if ステートメントを使用して、無効なベクトルを作成します (4 以内に近い)。for ループが通過したら、それらを削除します。

正直なところ、この部分であなたが何をしようとしているのかもよくわかりません。

右に 8 つの要素 (ゼロクロッシングから) を取得すると、少なくとも 80% の日が正であり、左に 6 つの要素 (ゼロクロッシングから) を取得すると、少なくとも 60% の日が負でした。 .

しかし、それはいくつかの基本的なifステートメントで十分に簡単なはずです..

すべてのクールなプログラミング プロジェクトは、赤ちゃんのステップで行われました。

于 2013-07-15T18:28:05.717 に答える
0

これはかなり紛らわしいです。私は実際に、一歩下がって、言葉ではなく、コード/数学で必要なものを正確に再定義することが最善であることがよくあります. たとえば、代わりに

右に 8 要素 (ゼロクロッシングから)、少なくとも 80% の日が陽性でした

試す

%Find all N such that
sum(sign(v((N):(N+7))))  >=    ceil(0.60 * 8)

(N+7)それは自然に、またはなどのいくつかの疑問を生じさせ(N+8)ます。

要件の段落でこれを行う簡単な試みを行いました。

%Given the input
v=[-1 2 3 -9 -8 -6 -7 -9 -3 -2 -5 -6 -3 1 6 8 5 9 7 4 5 6 -5 -7 2 5 3 2 -2 -1 -5 -4 1 4 3 5 6 3  4 3 -4 5];

%Find all N such that
%    **** low to high zero crossing
%    (1)  v(N)   > 0
%    (2)  v(N-1) < 0
%    **** +/- 4 days of no zero crossings
%    (3)  all(v((N-5):(N-1))  < 0)
%    (4)  all(v((N):(N+4))  > 0)
%    **** +/- 8 days of rare zeros crossings
%    (3)  sum(sign(v((N-8):(N-1))))  <= - floor(0.60 * 8)
%    (4)  sum(sign(v(  (N):(N+7))))  >=    ceil(0.80 * 8)

この時点で (そして私の翻訳に同意していただければ)、適切なループを書くのは非常に簡単です。

%Simple loop
maskResult = false(size(v));
vSign = sign(v);
for ix = 9:(length(v)-8)
    if ...
            all(vSign((ix-5):(ix-1))  < 0) && ...
            all(vSign((ix):(ix+4))  > 0)  && ...
            sum(sign(vSign((ix-8):(ix-1))))  <= - floor(0.60 * 8)  && ...
            sum(sign(vSign(  (ix):(ix+7))))  >=    ceil(0.80 * 8)
        maskResult(ix) = true;
    end
end

そして、あなたは結果を確認することができます

find(maskResult)   %returns 14, indicating the -3 -> 1 transition
于 2013-07-15T19:46:23.440 に答える