Ryan 的回答看起来不错。但是,如果您的条件是您需要找到累积和不完全是 360 的行号,那么您将需要做更多的工作。对于这种情况,您可以使用这个 -
试试这个矢量化(并且没有循环)代码来获取发生 360 分组的行 ID -
threshold = 360;
cumsum_val = cumsum(Turn);
ind1 = find(cumsum_val>=threshold,1)
num_events = floor(cumsum_val(end)/threshold);
[x1,y1] = find(bsxfun(@gt,cumsum_val,threshold.*(1:num_events)));
[~,b,~] = unique(y1,'first');
row_nums = x1(b)
之后就可以获取事件数据了,像这样-
event1 = Turn(1:row_nums(1));
event2 = Turn(row_nums(1)+1:row_nums(2));
event3 = Turn(row_nums(2)+1:row_nums(3));
...
event21 = Turn(row_nums(20)+1:row_nums(21));
...
eventN = Turn(row_nums(N-1)+1:row_nums(N));
编辑 1
示例案例:
我们创建了一个由20 随机整数组成的小数据,而不是用于原始问题的15000。此外,我们使用30 的阈值而不是360 来考虑小数据量。
代码
Turn = randi(10,[20 1]);
threshold = 30;
cumsum_val = cumsum(Turn);
ind1 = find(cumsum_val>=threshold,1)
num_events = floor(cumsum_val(end)/threshold);
[x1,y1] = find(bsxfun(@gt,cumsum_val,threshold.*(1:num_events)));
[~,b,~] = unique(y1,'first');
row_nums = x1(b);
运行
Turn =
7
6
3
4
5
3
9
2
3
2
3
5
4
10
5
2
10
10
5
2
threshold =
30
row_nums =
7
14
18
运行结果显示row_nums为7, 14, 18,表示第二组从Turn中的第7个索引开始,第三组从第14个索引开始,以此类推。当然,你可以在row_nums的开头附加1,表示第一个分组从第一个索引开始。