根据数组位置和计数器

时间:2015-08-18 21:55:20

标签: arrays matlab loops

我在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条记录的巨大向量重复此操作。对于任何程序员来说应该是直截了当的,但遗憾的是我的编程知识非常有限。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

@thewaywewalk给了一个很好的答案。仅供记录,这是一个修改后的版本,预先计算总和以更快地运行:

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阵列运行时间(如问题所述):

  • thewaywewalk'解决方案(使用循环): 10.163953秒
  • thewaywewalk'解决方案(使用arrayfun): 11.339777秒
  • 我的解决方案(预计算+ arrayfun): 0.371947秒

注意:使用以下方法创建数组:

N = 90000;
CrossingTime = randi(10000, 1, N);
Count = min(0:N-1, randi(N, 1, N) - 1);

答案 1 :(得分:0)

假设没有Count = 1Count = 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))