4
a=[2 3 6 7 2 1 0.01 6 8 10 12 15 18 9 6 5 4 2].

これは、増加傾向と減少傾向が始まる正確な値を抽出するために必要な配列です。

配列の出力は次のaようになります[2(first element) 2 6 9]

a=[2 3 6 7 2 1 0.01 6 8 10 12 15 18 9 6 5 4 2].
   ^       ^        ^               ^
   |       |        |               |

同様のタイプの配列についてMATLABで結果を取得するのを手伝ってください。

4

2 に答える 2

5

連続する数字の差の符号がどこで変わるかを見つける必要があります。いくつかの常識と関数diffsignfindを使用すると、次のソリューションが得られます。

a = [2 3 6 7 2 1 0.01 6 8 10 12 15 18 9 6 5 4 2];
sda = sign(diff(a));
idx = [1 find(sda(1:end-1)~=sda(2:end))+2 ];
result = a(idx);

編集:

符号関数は、同じである2つの連続した数値がある場合に問題を引き起こします。これはsign(0) = 0、がトレンドの変化として誤って識別されるためです。これらを除外する必要があります。これを行うには、最初に元のデータから連続する重複を削除します。トレンドの変化が始まる値だけが必要であり、実際に始まる位置は必要ないため、これが最も簡単です。

a(diff(a)==0) = [];
于 2012-07-19T12:17:14.163 に答える
1

これは、diff関数を使用するのに最適な場所です。

最初のステップは、次のことを行うことです。 B = [0 diff(a)]

0を追加する理由は、diff関数の動作方法のために、行列を同じ長さに保つためです。マトリックスの最初の要素から開始し、その要素と次の要素の違いを報告します。最初の要素の前に先頭の要素がないため、行列を1つの要素で切り捨てるだけです。開始要素であるため変更がないため、ゼロを追加します。

今の結果を見るとB、変曲点がどこにあるか(正の数から負の数に変わる場所)は非常に明白です。

これをプログラムで引き出すには、できることがたくさんあります。私は少し乗算とfindコマンドを使用する傾向があります。

Result = find(B(1:end-1).*B(2:end)<0)

これにより、語尾変化の先端にあるインデックスが返されます。この場合、次のようになります。

ans =

     4     7    13
于 2012-07-19T12:19:48.093 に答える