考虑例子
a=rand(5,1)
b=rand(5,1);
bs=sum(b);
B=b./bs;
cB=cumsum(B)
%OUTPUT
a =
0.7803
0.3897
0.2417
0.4039
0.0965
cB =
0.0495
0.4030
0.7617
0.9776
1.0000
现在我想要cB中数字的位置立即大于a中的数字。也就是说我想要a中的每个数字对应的5个位置。所以我的输出应该是
P= [4;2;2;3;2]
请帮忙。
其他人的建议是不错的,但都没有抓住重点,因为它们对于大问题的效率低下。这是 histc 做得最好的工作。(我承认 histc 显然不是您要解决此问题的工具。我希望他们选择了一些更明显的名称,因为似乎很少有人知道它。histc 用于直方图,也用于评估样条.)
对于您的测试用例...
a = [0.7803 0.3897 0.2417 0.4039 0.0965];
cB = [0.0495 0.4030 0.7617 0.9776 1.0000];
[~,b] = histc(a,cB);
b = b + 1
b =
4 2 2 3 2
Histc 返回目标下元素的索引,因此您需要加 1。
编辑:
Eitan 指出,如果 cB 不是单调的,那么就有问题。但是,在这种情况下,任何解决方案都存在问题,因为解决方案不会是唯一的。如果没有提供更多信息,例如您想要第一个或最后一个合格索引,则对于完全一般的 cB 问题没有有效的答案。例如,如果我们有:
cB = [1 3 2 4];
a = 2.5;
可能有两种可能的解决方案,因此索引为 2 或 4。请注意,早在 histc 作为 MATLAB 中的工具提供之前,我必须在过去为客户提供针对此问题的解决方案。例如,在样条代码中,常见问题是定位点所在的节点区间。当然,节点必须按排序顺序排列。(我将忽略重复中断的问题。)在样条代码中还有一种情况,其中 bin 边缘未按排序顺序,这就是找到样条的反值的情况,然后不需要完全单调。在这种情况下,解决最正确的解决方案可能是合适的。只有客户会做出这个决定。
由于示例中生成的 cB 是严格单调的,因此我只能假设单调性是该问题假设的一部分。
尝试这个:
pos = sum(bsxfun(@le, cB, a')) + 1
另一个(相当于一个循环):
pos = arrayfun(@(x) find(x < cB, 1, 'first'), a)