我很难在matlab中向量化此for循环,这确实很慢。tvec和data分别是N×6和N×4数组,它们是函数的输入。
% preallocate
sVec = size(tvec)
tvec_ab = zeros(sVec(1),6);
data_ab = zeros(sVec(1),4);
inc = 0;
for i = 1:12
for j = 1:31
inc = inc +1;
[I,~] = find(tvec(:,3)==i & tvec(:,2)== j,1,'first');
if(I > 0)
tvec_ab(inc,:) = tvec(I,:);
data_ab(inc,:) = sum(data( (tvec(:,3) == j) & (tvec(:,2)==i) ,:));
end
end
end
% set output values
tvec_a = tvec_ab(1:inc,:);
data_a = data_ab(1:inc,:);
中的每一行都tvec
代表时间戳,在该时间戳中数据是在数据矩阵的同一行中获取的。在下面,您可以看到一行的样子:
tvec
: [year, month, day, hour, minute, second]
data
: [dataA, dataB, dataC, dataD]
在主程序中,我们可以选择在月,日或小时之后“汇总”。上面的代码是如何进行选项聚合的示例'DAY'
。
当天的第一个时间戳是我们希望输出tvec_a
在当天的行中包含的时间戳。
当天(本例中为行)的数据输出将是该天所有数据的总和。例子:
data
:
[data1ADay1, data1BDay1, data1CDay1, data1DDay1;
data2ADay1, data2BDay1, data2CDay1, data2DDay1]
汇总数据:
[data1ADay1 + data2ADay1, data1BDay1 + data2BDay1, data1CDay1+ data2CDay1,
data1DDay1+data2DDay1]
实际上,我自己找到了一种方法:
%J is the indexes of the first unique days ( eg. if there is multiple
%data from january 1., the first time stamp from january 1. will be
%the time samp for our output)
[~,J,K] = unique(tvec(:,2:3),'rows');
%preallocate
tvec_ab = zeros(length(J),6);
data_ab = zeros(length(J),4);
tvec_ab = tvec(J,:);
%sum all data from the same days together column wise.
for i = 1:4
data_ab(:,i) = accumarray(K,data(:,i));
end
%set output
data_a = data_ab;
tvec_a = tvec_ab;
谢谢你的回应
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句