在Matlab中向量化而不是嵌套循环

S.MC。

我很难在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]
S.MC。

实际上,我自己找到了一种方法:

 %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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章