我有两个排序的向量x
和y
。对于每个y(i)
,我想找到第一个索引j
,使y(i) >= x(j)
。
示例:
x = [1 3 5 7 9 11 13 15]
y = [3 4 5 9 10 11]
result = [2 2 3 5 5 6]
最有效的方法是什么?
答案 0 :(得分:1)
[~,result] = min(bsxfun(@gt, y(:), x(:).'), [], 2)
您可以利用广播,您可以创建两个2D矩阵,其中y
在列上重复,x
在行上重复。我采用相反的问题,对于y
的每个值,我们找到第一个位置最小。因此,结果将为y
中的每个值提供解决方案。请注意,我可以使用max
来解决这个问题并改变比较操作,但我更喜欢这种方式。
>> x = [1 3 5 7 9 11 13 15]
x =
1 3 5 7 9 11 13 15
>> y = [3 4 5 9 10 11]
y =
3 4 5 9 10 11
>> [~,result] = min(bsxfun(@gt, y(:), x(:).'), [], 2)
result =
2
3
3
5
6
6
我有一种感觉,你将把它用于线性插值:)
答案 1 :(得分:0)
因为向量x是部分有序的(因此是单调的),所以需要横向y的每个条目的整个x。以下代码应该在MATLAB中起作用:
lastOccurrence=1
for i = 1:length(y)
for j = lastOccurrence:length(x)
if y(i)<x(j)
lastOccurence=j-1
result(i) = j-1
break
end
end
end