2

我有两个数组阈值和值。

threshold=[10 22 97]  
values=[99 23 77 11 8 10]  

我想输出 idx 使得阈值(idx-1)<值(i)<=阈值(idx)。那就是上面的示例输出将是

output=[4 3 3 2 1 1]  

可以产生上述输出的天真代码将是

output=ones(1,length(values))*(length(values)+1); 
for i=1:length(values)  
  for j=1:length(threshold)  
    if(values(i)>threshold(j))  
       output(i)=j;
    end  
  end  
end   

有没有一种简单的方法来做到这一点。我想避免循环。

4

2 回答 2

3

可以使用histc命令,稍微调整threshold数组

>> threshold=[-inf 10 22 97 inf];
>> values=[99 23 77 11 8 10]; 
>> [~, output] = histc( values, threshold+.1 )
output =

 4     3     3     2     1     1

的修改threshold是由于箱边界决策的“小于”/“小于等于”类型的比较。

于 2013-11-12T08:23:42.427 回答
2

没有循环通常意味着您将通过增加峰值内存来提高速度。试试这个:

threshold = [10 22 97];
values    = [99 23 77 11 8 10];

%// Do ALL comparisons
A = sum(bsxfun(@gt, values.', threshold));

%// Find the indices and the ones before 
R = max(1, [A; A-1]);

%// The array you want
R(:).'

如果内存不足,只需使用循环,然后find替换内部循环。

你知道,循环并不是那么糟糕(如果你有 MATLAB > R2008)。从理论上讲,上面的解决方案甚至不应该比带有 的循环更快find,但是哦……分析是关键:)

于 2013-11-12T08:19:37.030 回答