【发布时间】: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你理想的“大”数据集是什么? -
@Mariofor循环中的最后一个 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