大数据集的范围值

时间:2014-11-08 13:16:52

标签: performance matlab for-loop vectorization

我有一个似乎无法解决的问题。我想要一个查询来确定给定值是否位于预定义的范围内,但我的循环对于大数据集来说非常慢。有更有效的方法吗?

clear all
close all

Regression(1,1) = 1.001415645694801;
Regression(1,2) = 0.043822386790753;

FF_Value(:,1) = [24.24 30.77 31.37 29.05 29.20 29.53 29.67 27.78];
FF_Value(:,2) = [24.16 30.54 31.15 29.53 29.39 29.34 29.53 28.17];

FF_Distance = FF_Value(:,2)-(Regression(1,2)+Regression(1,1)*FF_Value(:,1));

FF_Distance_Positiv = sort(FF_Distance(FF_Distance > 0));
FF_Distance_Positiv(FF_Distance_Positiv == 0) = [];

FF_Distance_Negativ = sort(FF_Distance(FF_Distance < 0),'descend');
FF_Distance_Negativ(FF_Distance_Negativ == 0) = [];

A = repmat(FF_Distance_Positiv,length(FF_Distance_Negativ),1);
B = repmat(FF_Distance_Negativ',length(FF_Distance_Positiv),1);
C = reshape(B,[length(FF_Distance_Positiv)*length(FF_Distance_Negativ),1]);

Recognition(:,1) = A;
Recognition(:,2) = C;

FF_Recognition = zeros(length(FF_Value),1);
for i = 1:length(Recognition)
    for j = 1:length(FF_Value)
       if (Regression(1,2)+Recognition(i,1))+Regression(1,1)*FF_Value(j,1) >= FF_Value(j,2)     &&...
            (Regression(1,2)+Recognition(i,2))+Regression(1,1)*FF_Value(j,1) <= FF_Value(j,2)
        FF_Recognition(j,1) = 1;
    end 
end
end

1 个答案:

答案 0 :(得分:1)

欢迎来到 bsxfun's 的世界,取代 repmats 的世界 -

%------------ Original code -----------------------------------------

FF_Distance = FF_Value(:,2)-(Regression(1,2)+Regression(1,1)*FF_Value(:,1));

FF_Distance_Positiv = sort(FF_Distance(FF_Distance > 0));
FF_Distance_Positiv(FF_Distance_Positiv == 0) = [];

%// Note for Performance: If number of elements satisfying `FF_Distance_Positiv == 0`
%// is a lot, consider doing this instead - 
%// `FF_Distance_Positiv = FF_Distance_Positiv(FF_Distance_Positiv~=0)`.
%// Follow this strategy for `FF_Distance_Negativ` too.

FF_Distance_Negativ = sort(FF_Distance(FF_Distance < 0),'descend');
FF_Distance_Negativ(FF_Distance_Negativ == 0) = [];

%------- Added vectorization replacing `repmats` and nested loops ------------

mult = Regression(1,1)*FF_Value(:,1);

y1 = bsxfun(@plus,Regression(1,2),FF_Distance_Positiv);
y2 = bsxfun(@plus,y1.',mult); %//'
mc1 = bsxfun(@ge,y2,FF_Value(:,2));

z1 = bsxfun(@plus,Regression(1,2),FF_Distance_Negativ);
z2 = bsxfun(@plus,z1.',mult); %//'
mc2 = bsxfun(@le,z2,FF_Value(:,2));

FF_Recognition = all([any(mc1,2) any(mc2,2)],2);