2014-11-08 81 views
2

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

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 
+0

没有,零也将是确定:) – Mario 2014-11-08 13:40:45

+0

'@ Mario'what是您理想的 “大”数据集? – ha9u63ar 2014-11-08 13:41:16

+0

大约25000个值 – Mario 2014-11-08 13:45:46

回答

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);