我试图确定一个值是否在向量中按顺序重复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次的平均值。我试图用内置函数(如果有的话,我没有发现它)或至少避免循环来做这个。
关于我如何接近的任何想法?
答案 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
变量开始参考每次运行的位置。