0

値がベクトル内でN回連続して繰り返されるかどうかを識別しようとしています。私が直面している課題は、ベクトル内でN回連続して数回繰り返すことができるということです。目的は、特定の値が平均値を超える回数を連続して決定することです。例えば:

>> return_deltas

return_deltas = 

      7.49828129642663
      11.5098198572327
      15.1776644881294
       11.256677995536
      6.22315734182976
      8.75582103474613
      21.0488849115947
       26.132605745393
      27.0507649089989
      ...

(たとえば、いくつかの値を出力しただけですが、ベクトルは大きくなります。)

>> mean(return_deltas)

ans =

     10.50007490258002

>> sum(return_deltas > mean(return_deltas))

ans =

    50

return_deltasしたがって、の平均よりも大きい値のインスタンスは50個ありますreturn_deltas

return_deltasの値が3回続けて平均よりも大きい回数を順番に特定する必要があります。つまり、の値return_deltasが3回続けて平均よりも大きい場合、それは1つのインスタンスです。

例えば:

---------------------------------------------------------------------
| `return_delta` value | mean        | greater or less | sequence   |
|--------------------------------------------------------------------
|   7.49828129642663   |10.500074902 | LT              | 1          |
|  11.5098198572327    |10.500074902 | GT              | 1          |
|  15.1776644881294    |10.500074902 | GT              | 2          |
|   11.256677995536    |10.500074902 | GT              | 3 *        |
|  6.22315734182976    |10.500074902 | LT              | 1          |
|  8.75582103474613    |10.500074902 | LT              | 2          |
|  21.0488849115947    |10.500074902 | GT              | 1          |
|   26.132605745393    |10.500074902 | GT              | 2          |
|  27.0507649089989    |10.500074902 | GT              | 3 *        |
---------------------------------------------------------------------

星は、連続した3の成功したシーケンスを表します。このセットの結果は、値が3回続けて平均よりも大きい場合が2回あったため、2になります。

私が考えているのは、新しいベクトルを作成することです。

>> a = return_deltas > mean(return_deltas)

もちろん、の値がreturn_deltas平均よりも大きいものが含まれており、それを使用して連続して何回かを調べると、の値はreturn_deltas3回続けて平均よりも大きくなります。私は組み込み関数(ある場合はそれを発見していません)を使用してこれを実行しようとしていますが、少なくともループを回避しています。

私がどのようにアプローチするかについて何か考えはありますか?

4

1 に答える 1

1

少しの作業で、このスニペットはすべての数値の実行の開始インデックスを見つけます。

[0 find(diff(v) ~= 0)] + 1

例:

>> v = [3 3 3 4 4 4 1 2 9 9 9 9 9];           # vector of integers
>> run_starts = [0 find(diff(v) ~= 0)] + 1    # may be better to diff(v) < EPSILON, for floating-point

run_starts =

     1     4     7     8     9

各実行の長さを見つけるには

>> run_lengths = [diff(run_starts), length(v) - run_starts(end) + 1]

この変数により、特定の数を超えた実行を簡単に照会できます。

>> find(run_lengths >= 4)

ans =

     5

>> find(run_lengths >= 2)

ans =

     1     2     5

これは、連続した少なくとも4つの整数の実行が#5で実行されたことを示しています。
ただし、連続して少なくとも2つの整数である3つの実行がありました。具体的には、実行#1、#2、および#5です。各実行がrun_starts変数から開始する場所を参照できます。

于 2012-07-15T19:20:36.273 に答える