在另一个中找到第一个大于或等于矢量值的索引

时间:2016-08-06 15:02:00

标签: matlab vector

我有两个排序的向量xy。对于每个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]

最有效的方法是什么?

2 个答案:

答案 0 :(得分:1)

使用bsxfunmin时会想到:

[~,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