Performance 大数据集范围内的值
我有一个似乎无法解决的问题。我需要一个查询来确定给定的值是否在预定义的范围内,但是对于大型数据集,我的循环非常慢。有没有更有效的方法Performance 大数据集范围内的值,performance,matlab,for-loop,vectorization,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.
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,1)=1.001415645694801;
回归(1,2)=0.043822386790753;
FF_值(:,1)=[24.24 30.77 31.37 29.05 29.20 29.53 29.67 27.78];
FF_值(:,2)=[24.16 30.54 31.15 29.53 29.39 29.34 29.53 28.17];
FF_距离=FF_值(:,2)-(回归(1,2)+回归(1,1)*FF_值(:,1));
FF_距离_正值=排序(FF_距离(FF_距离>0));
FF_距离_正值(FF_距离_正值==0)=[];
FF_距离\负=排序(FF_距离(FF_距离<0),“下降”);
距离负(距离负=0)=[];
A=repmat(正距离,负距离),长度为1;
B=repmat(负向距离),长度(正向距离),1;
C=重塑(B,[长度(正距离)×长度(负距离),1]);
识别(:,1)=A;
识别(:,2)=C;
FF_识别=零(长度(FF_值),1);
对于i=1:长度(识别)
对于j=1:长度(FF_值)
如果(回归(1,2)+识别(i,1))+回归(1,1)*FF_值(j,1)>=FF_值(j,2)&。。。
(回归(1,2)+识别(i,2))+回归(1,1)*FF_值(j,1)欢迎来到的世界,取代你的-
%------------ 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);
%-----------原始代码-----------------------------------------
FF_距离=FF_值(:,2)-(回归(1,2)+回归(1,1)*FF_值(:,1));
FF_距离_正值=排序(FF_距离(FF_距离>0));
FF_距离_正值(FF_距离_正值==0)=[];
%//性能注意事项:如果满足'FF_Distance_positive==0的元素数`
%//是很多,考虑这样做,
%//`FF_Distance_positive=FF_Distance_positive(FF_Distance_positive~=0)`。
%//也要遵循“FF\u Distance\u negative”这一策略。
FF_距离\负=排序(FF_距离(FF_距离<0),“下降”);
距离负(距离负=0)=[];
%-------添加了矢量化以替换“repmats”和嵌套循环------------
mult=回归(1,1)*FF_值(:,1);
y1=bsxfun(@plus,回归(1,2),FF_距离_正值);
y2=bsxfun(@plus,y1',mult);%/'
mc1=bsxfun(@ge,y2,FF_值(:,2));
z1=bsxfun(@plus,回归(1,2),FF_距离_负);
z2=bsxfun(@plus,z1',mult);%/'
mc2=bsxfun(@le,z2,FF_值(:,2));
FF_识别=所有([任何(mc1,2)任何(mc2,2)],2);
不,零也可以:)@Mario
你理想的“大”数据集是什么?@Mario
你在for
循环中的最后一个if条件有括号失衡(我想)。我会用我的matlab脚本来做,但是你能确认并编辑代码片段吗?此外,您将使用结束for和if条件代码>…不要那样做。是的,我当然会这样做@mario
您已经预先分配了结果矩阵FF\u Recognition
,以加快处理速度。我建议您看看是否可以编写1)生成数据的脚本,即FF_值和与数据相关的内容。2) 编写一个函数,调用脚本生成数据,并使用该函数计算FF_识别并返回结果。以下是一些固定MATLAB程序的已知技术。另外,如果您使用浮点(零(长度(FF_值),1))
而不是NaN,也可以。试着在新代码上运行一个分析器,并进行比较,看看改进了多少!