2013-10-09 39 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> 
相關問題