我无法在matlab中对此for循环进行矢量化,这非常慢。 tvec和数据分别是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]
答案 0 :(得分:1)
矢量化版本(未经过全面测试)
[x y] = meshgrid(1:12,1:31);
XY=[x(:) Y(:)];
[I,loc]=ismember(XY,tvec(:,2:3),'rows');
tvec_ab(I)=tvec(loc(loc>0),:);
acm = accumarray(tvec(:,2:3),data);
data_ab(I) = acm(sub2ind(size(acm),tvec(:,2),tvec(:,3)));
答案 1 :(得分:0)
我实际上找到了一种自己做的方法:
%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;
感谢您的回复