【发布时间】:2016-08-06 15:01:59
【问题描述】:
我有两个已排序的向量 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]
最有效的方法是什么?
【问题讨论】:
我有两个已排序的向量 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]
最有效的方法是什么?
【问题讨论】:
[~,result] = min(bsxfun(@gt, y(:), x(:).'), [], 2)
您可以利用广播创建两个二维矩阵,其中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
我感觉你会用它来进行线性插值:)
【讨论】:
因为向量 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
【讨论】: