2013-10-09 103 views
1

我在避免Matlab中的循环时遇到了问题。我被告知循环会导致糟糕的表现,所以我正在修改已经在循环中工作的代码。检查x是否在没有循环的间隔中

我有一个矢量大矢量x包含值和一个较小的X,也包含值。对于每个值x,我必须知道它在哪个区间。我将第i个区间定义为X_i-1和X_i之间的值。现在,我这样做:

len = length(x); 
is = zeros(len, 1); % Interval for each x 
for j=1:len 
    i=1; % Start interval 
    while(x(j)<X(i-1) || x(j)>X(i)) % Please consider accessing X(0) won't crash it's a simplification to make the code clearer for you. 
     i = i + 1; 
    end 
    is(j) = i; 
end 

没有这些循环做到这一点的方式是什么?

编辑:为了帮助你了解情况,这里有一个我想在这里做的事情的真实例子。利用这些输入

X = [1 3 4 5] 
x = [1 1.5 3.6 4.7 2.25] 

我想is

% The 2 first and the 5th are in the first interval [1, 3] 
% The 3rd is in [3, 4] and the 4th is in [4, 5] 
is = [1 1 2 3 1] 
+3

有人告诉你错了,循环不(无条件地)导致性能下降。最近发布的Matlab与等效向量化代码的性能相比,稳定地改进了循环的性能(一般情况下)。现在你已经被告知,否则,你是否还想重做你的代码? –

+0

其实我会被认为循环不好的同一个人分级,所以我有点不得不重做它,即使它不是真的有必要... – francoisr

+2

因此编辑你的问题,有人可能会对你的情况表示同情。但不是我。这并不是说我不在乎,我真的是,真的,但是这里是啤酒。 –

回答

4

明显的功课,所以我就指向你两个功能,可以帮助你:

  • 如果您的间隔列表具有恒定的间距,请查看floor并了解如何直接计算索引。

  • 如果间隔不规则间隔,请查看histc,特别是查看带有2个输出参数的表单。

还有一个问题,您的示例代码:试着去了解的时候x(j)任何区间之外会发生什么。

+0

感谢您的回复。我看着'histc',我无法使用它,因为我的x向量未按升序排序,而且我也无法对其进行排序。也许循环是这种情况下唯一的选择?我只是寻找一个更聪明的方式来做我已经做的循环:/ – francoisr

+0

为什么你不能排序'x'? –

+0

如果我对它进行分类,那么在脚本的其余部分就没有任何意义。我可以对它进行排序,但是在计算'is'后脚本的其余部分工作后,我必须“退出”。 :/ – francoisr

0

我使用的口罩,然后我转向第二个面具,然后我用find返回者的指标:

ranges = [1,2,3,4]; %<br> 
a = 1.5; %<br> 
m1 = (a >= ranges); % will be [1, 0, 0, 0] <br> 
m2 = (a <= ranges); % will be [0, 1, 1, 1] <br> 
m2(1:end-1) = m2(2:end); % will be [1, 1, 1, 1], I am trying to shift this mask <br> 
m2(end) = 0; % will be [1, 1, 1, 0], the mask shift is completed <br> 
b = find(m1 & m2); % this will return 1 so your value is between 1 and 2 <br> 
相关问题