MATLAB:确定一个值是否在向量中顺序重复N次

时间:2012-07-15 18:44:58

标签: matlab vector

我试图确定一个值是否在向量中按顺序重复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次,那就是一个实例。

例如:

---------------------------------------------------------------------
| `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中的值大于均值并使用它来查找顺序次数的值,return_deltas中的值大于连续3次的平均值。我试图用内置函数(如果有的话,我没有发现它)或至少避免循环来做这个。

关于我如何接近的任何想法?

1 个答案:

答案 0 :(得分: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 但是,有三个运行连续至少有两个整数,特别是运行#1,#2和#5。 您可以从run_starts变量开始参考每次运行的位置。