Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 大数据集范围内的值_Performance_Matlab_For Loop_Vectorization - Fatal编程技术网

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,也可以。试着在新代码上运行一个分析器,并进行比较,看看改进了多少!