避免循环检查数字是否在一组间隔内

时间:2016-08-18 15:30:40

标签: matlab for-loop

我有一个概率向量,例如,P = [0.1,0.2,0.3,0.4]。然后我使用命令cumsum创建另一个向量Q = cumsum(P)= [0.1,0.3,0.6,1.0] 我生成一个Uniform [0,1]随机向量,X = [0.11,0.72,0.32,0.94],我想知道X的每个条目是否位于[0,0.1]或[0.1,0.3]之间或[ 0.3,0.6],或[0.6,1.0]我希望返回一个向量,其中包含X的每个条目所属的区间索引。

有没有一种快速的方法可以做到这一点,而无需编写for循环?

1 个答案:

答案 0 :(得分:0)

对于输入:数字x和矢量Q

假设你想要在每个区间的上端点中保持相等(通常在概率上),它就像

一样简单
ind = find(x<=Q, 1);

对于下端点的相等性,

ind = find(x<Q, 1);

对于输入:向量x和矩阵Q

在这种情况下,您可以使用max的第二个输出,它作为一种矢量化find

x = [.5; .3; .2];
Q = [.1 .3 .5 .7 1;
     .2 .3 .4 .8 1
     .1 .1 .3 .6 1]
[~, ind] = max(bsxfun(@le, x(:), Q), [], 2)

这给出了

ind =
     3
     2
     3