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

所以有 50 个实例的值return_deltas大于 的平均值return_deltas

我需要依次确定值连续return_deltas3 次大于其平均值的次数。换句话说,如果 中的值return_deltas连续 3 次大于其平均值,则为一个实例。

例如:

---------------------------------------------------------------------
| `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 次大于平均值。

我在想的是创建一个新的向量:

>> a = return_deltas > mean(return_deltas)

当然,其中包含值return_deltas大于平均值的值,并使用它来查找连续多少次,值 in 连续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

这告诉我们,连续运行至少四个整数的唯一运行是运行 #5。
但是,有 3 次运行至少连续两个整数,特别是运行 #1、#2 和 #5。您可以参考每次运行从run_starts变量开始的位置。

于 2012-07-15T19:20:36.273 回答