【问题标题】:value in range for big datasets大数据集范围内的值
【发布时间】:2014-11-08 13:16:51
【问题描述】:

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

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

【问题讨论】:

  • 不,零也可以:)
  • @Mario你理想的“大”数据集是什么?
  • @Mario for 循环中的最后一个 if 条件有括号不平衡(我认为)。我将在我的 matlab 脚本中执行此操作,但您能确认并编辑 sn-p 吗?另外,如果条件为;....不要那样做。
  • 是的,我当然会这样做
  • @mario 您已经预先分配了结果矩阵FF_Recognition 以加快处理速度。我建议您看看您是否可以编写 1) 用于生成数据的脚本,即您的 FF_Value 和与数据相关的东西。 2) 编写一个函数,调用脚本生成数据并使用该函数计算 FF_Recognition 并返回结果。这些是固定 MATLAB 程序的一些已知技术。此外,如果您使用 float(zeros(length(FF_Value),1)) 而不是 NaN,那也可以。尝试在新代码上运行分析器并进行比较,看看改进了多少!

标签: performance matlab for-loop vectorization


【解决方案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);

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多