2012-05-11 78 views
0

我有兩個不同大小的A和B的數組。我比較A和B,並希望找到A中的每個元素B中的第一個元素是更小/更大。Matlab:在一個數組中找到第一個更小或更大的元素

我想使用類似ismember(A,B)的東西,除了我不尋找相同的元素。問題在於'find'不起作用,因爲A和B的大小不一樣。

我現在使用一個循環,但我正在尋找一個更優雅的方式來編程。這裏是循環:

 for zz=1:length(A) 
      tmpmax(zz) = find(B>=A(zz),1); 
      tmpmin(zz) = find(B<=A(zz),1,'last');     
     end 

感謝您的建議!

IMMO

+0

即使它們的尺寸相同,找到仍然不合適。 – 2012-05-11 15:08:35

回答

1

你可以擺脫循環:

tmpmin = arrayfun(@(x) find(B>=x,1), A); 
tmpmax = arrayfun(@(x) find(B<=x,1,'last'), A); 
1

這取決於你會做這個多久了,怎麼大的載體。但我會建議預處理數組B。例如,考慮測試案例:

B = rand(1,10) 
B = 
    0.82346 0.69483 0.3171 0.95022 0.034446 0.43874 0.38156 0.76552 0.7952 0.18687 

我們將需要建立一個累積最小和最大向量。如果B相當長,有幾種方法可以完成。

Bmin = B; 
N = inf; 
while numel(Bmin) < N 
    N = numel(Bmin); 
    k = find(diff(Bmin) >= 0); 
    Bmin(k+1) = []; 
end 
Bmax = B; 
N = inf; 
while numel(Bmax) < N 
    N = numel(Bmax); 
    k = find(diff(Bmax) <= 0); 
    Bmax(k+1) = []; 
end 

然後

Bmin 
Bmin = 
    0.82346  0.69483  0.3171  0.034446 

Bmax 
Bmax = 
    0.82346  0.95022 

(我可以用一個簡單的for循環也已建立BminBmax,它可能會一直較快,但while循環是寫更多的樂趣。)

現在很簡單。爲了找到大於任何給定值的B的第一個元素,請在Bmax上使用histc。而且由於histc是矢量化的,所以操作很快。要做到這一點,看看histc的第二個返回參數。或者,你可以寫一個向量化的二進制搜索方案。 histc也將通過翻轉Bmin中元素的順序來解決最小元素問題。

如果您的目標是找到元素的INDEX,那麼通過在構建BminBmax時保留該信息,這一點也非常簡單。

+0

@guntherstruyf - 感謝您修復此問題。 – 2012-10-23 14:09:05

相關問題