我在MATLAB中有两个向量如下:
Crossing Time = [11 14 16 18 29 18 53 22 18 11 19 10 15 15 13 18];
Count = [0 0 2 3 0 0 4 3 6 2 5 0 3 5 2 7];
我想根据计数计算穿越时间的平均值。 例如:如果count为零,则相应的交叉时间只是交叉时间向量的值 即,对于计数向量中的第一个零,交叉时间是11,对于第二个零,交叉时间是14.这是直截了当的。 但是,如果计数非零,例如2(计数向量中的第三列),我想要除2之后的第2和第3列交叉时间向量的平均值 (即2旁边的平均值为14和16)。 如果计数为4(计数向量中的第7列),那么我想要交叉时间向量的第4到第7列的平均值。
在这样做时,我会得到以下均值向量:
Mean = [11 14 15 16 29 18 29.5 31 26.33 14.5 24.6 10 14.67 14 14 14.43]
如何在循环中执行此操作,以便我可以为包含90,000条记录的巨大向量重复此操作。对于任何程序员来说应该是直截了当的,但遗憾的是我的编程知识非常有限。
感谢您的帮助。
答案 0 :(得分:1)
cumulative = [0 cumsum(CrossingTime)];
meanVal = arrayfun(@(x) (cumulative(x + 1) - cumulative(x - max(Count(x), 1) + 1)) / max(Count(x), 1), 1:numel(Count));
clear cumulative;
使用随机化的90.000阵列运行时间(如问题所述):
注意:使用以下方法创建数组:
N = 90000;
CrossingTime = randi(10000, 1, N);
Count = min(0:N-1, randi(N, 1, N) - 1);
答案 1 :(得分:0)
假设没有Count = 1
但Count = 0
的行为与Count = 1
相似,
Count(~Count) = 1;
cs = [0 cumsum(CrossingTime)];
meanVal = arrayfun(@(x,y) (cs(x+1) - cs(1 + x-y))/y, 1:numel(Count), Count)
循环可以如下:
Count(~Count) = 1
meanVal = zeros(1,numel(CrossingTime));
for ii = 1:numel(CrossingTime)
meanVal(ii) = mean( CrossingTime(ii:-1:ii-Count(ii)+1));
end
或者使用arrayfun
,基本相同:
Count(~Count) = 1
meanVal = arrayfun(@(x) mean( CrossingTime(x:-1:x-Count(x)+1)), 1:numel(Count))