矢量化而不是在matlab中嵌套for循环

时间:2017-01-16 09:48:11

标签: matlab vectorization

我无法在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]

2 个答案:

答案 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;

感谢您的回复