2014-04-22 72 views
0

的我的代码的简化版本如下:截断阵列

A = linspace(0,10,100); 
threshold = 6.0; 

我想截断矢量A在低于阈值的值。

假设A中的值总是上升的,我怎么能做到这一点和整齐高效?

目前我能想到的唯一方法是引入一个for循环和检查每个元件,一个接一个,并且如果它具有高于阈值的值,然后该值分配给一个新的数组。就像这样:

k=1; 
    for i = 1:numel(A) 
     if A(i) < threshold 
     elseif A(i) >= threshold 
      Atrunc(k,1) = A(i); 
      k=k+1; 
     end 
    end 

但是,这对我来说似乎不是很好,任何人都可以提供更优化的代码...?

+4

使用该量化形式更快 - 'Atrunc = A(A> =阈值)' – Divakar

回答

2

使用逻辑索引

A = A(A < threshold); 

A = A(A >= threshold); 
0

由于A价值正在提升,你可以使用binary search找到低于阈值的最后一个元素:

threshold = 5; %// example data 
A = linspace(0,15,1e7); %// example data 

w = [1 numel(A)]; %// uncertainty window. Initiallize 
while w(2)>w(1)+1 
    t = round((w(1)+w(2))/2); %// test middle point 
    if A(t)<threshold 
     w(1) = t; %// remove lower half of window 
    else 
     w(2) = t; %// remove upper half of window 
    end 
end 
if A(w(2)) < threshold %// handle special cases: Atrunc is A or is [] 
    t = w(2); 
elseif A(w(1)) < threshold 
    t = w(1); 
else 
    t = w(1)-1; 
end 
Atrunc = A(1:t); 

对于A大的这种方法(它利用了事实帽子A排序)可以比Atrunc = A(A < threshold);