使用MATLAB(R2015b)我有一个4000x3矩阵的时间序列A
。下面是一个示例,其中第一列是序列时间(此处为13:56:37至14:25:09),第二列和第三列是测量值:
1.0e+05 *
7.366965809837962 0.000082000000000 0.062000000000000
7.366965810300925 0.000082500000000 0.013000000000000
7.366965836689815 0.000083000000000 0.040000000000000
7.366965857291667 0.000085000000000 0.013000000000000
7.366965875810186 0.000086000000000 0.010000000000000
7.366965876851851 0.000086000000000 0.020000000000000
7.366965889351852 0.000087000000000 0.015000000000000
7.366965892245370 0.000087000000000 0.016000000000000
7.366965896875000 0.000087000000000 0.004000000000000
7.366965897337963 0.000087500000000 0.050000000000000
7.366965901967592 0.000087500000000 0.002000000000000
7.366965906018518 0.000093000000000 0.010000000000000
7.366965907060185 0.000093000000000 0.010000000000000
7.366965928587963 0.000092000000000 0.010000000000000
7.366965962268518 0.000091500000000 0.030000000000000
7.366965973263889 0.000092000000000 0.001000000000000
7.366965974768519 0.000092000000000 0.050000000000000
7.366965982060186 0.000090000000000 0.010000000000000
7.366965993402777 0.000090000000000 0.090000000000000
7.366966007986111 0.000090000000000 0.043330000000000
如何计算每五分钟(而不是每个事件)第二和第三列的平均值?所以对于前5分钟13:55:00 - 14:00:00我们应该得到中间列的平均值8.225和右列的平均值3750,例如:
13:55:00 8.225 3750
14:00:00 8.4 2650
我尝试过没有成功,所以非常感谢任何帮助。
答案 0 :(得分:2)
我认为这可以帮到你
%Inital reference position
pos=1;
%Counter
count=1;
for i=2:20
%Elapsed seconds since the reference position
elapsed_seconds=etime(datevec(a(i,1)),datevec(a(pos,1)));
if elapsed_seconds>5*60 %Calculate means if larger than 5 minutes
matrix(count,1)=a(pos,1);
matrix(count,2)=mean(a(pos:(i-1),2));
matrix(count,3)=mean(a(pos:(i-1),3));
count=count+1; %Update counter
pos=i; %Update reference position
end
end
matrix
答案 1 :(得分:1)
这个问题的好处在于你可以把它分解成容易的块。首先,让我们将矩阵分解为向量
times=A(1,:);
measurementX=A(2,:);
measurementY=A(3,:);
第二部分是你需要将时间分成5分钟的增量。让我们从7.366965809837962e5
(你第一次)开始,然后以5分钟为增量上升到7.366966007986111e5
(你的最后一次)。不幸的是,我不知道在MATLAB中以5分钟的增量存在多少个刻度,我任意假装它是123e3。您需要正确替换该号码。
timeIncrements=7.366965809837962e5:123e3:7.366966007986111e5
现在我们需要在一个增量开始之后和下一个增量开始之前找到所有时间的指示:
for (i=1:length(timeIncrements)-1)
indicies{i}=times>timeIncrements(i)&×<=timeIncrements(i+1);
end
现在我们得到平均值
for i=1:length(indicies)
measurementX_5minIncrements(i)=mean(measurementX(indicies{i}));
measurementY_5minIncrements(i)=mean(measurementY(indicies{i}));
end
巨大的注意!这是未经测试的,但提供了您需要做的一般要点。我无法访问MATLAB,无法使用它来确保它是正确的。 此外,这是非常详细,对你的问题有一个两行的答案,但没有实际使用MATLAB我无法想到它(曾经有一段时间我会把它从头脑中知道,但唉,那一天不复存在)。祝你好运!