【问题标题】:MATLAB: Identify if a value is repeated sequentially N times in a vectorMATLAB:确定一个值是否在向量中按顺序重复 N 次
【发布时间】:2012-07-15 18:44:58
【问题描述】:

我试图确定一个值是否在向量中按顺序重复 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 个成功的序列。这组的结果将是 2,因为有两次值连续 3 次大于平均值。

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

>> a = return_deltas > mean(return_deltas)

这当然包含return_deltas 中的值大于平均值的值,并使用它来查找连续多少次,return_deltas 中的值连续 3 次大于平均值。我正在尝试使用内置函数(如果有,我还没有发现它)或至少避免循环来做到这一点。

对我如何接近有什么想法吗?

【问题讨论】:

    标签: matlab vector


    【解决方案1】:

    通过一些工作,这个 sn-p 找到每个数字运行的起始索引:

    [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 变量引用每次运行的开始位置。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      相关资源
      最近更新 更多