【问题标题】:Find index of first greater than or equal values of a vector in another one [duplicate]在另一个向量中查找第一个大于或等于向量值的索引[重复]
【发布时间】:2016-08-06 15:01:59
【问题描述】:

我有两个已排序的向量 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]

最有效的方法是什么?

【问题讨论】:

    标签: matlab vector


    【解决方案1】:

    想到使用bsxfunmin

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

    小提示

    我感觉你会用它来进行线性插值:)

    【讨论】:

    • 是的,你是对的。谢谢。
    • 没问题。因为我现在知道你的最终目标是什么,所以我已经为你标记了一个适当的副本。祝你好运!
    【解决方案2】:

    因为向量 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
    

    【讨论】:

      猜你喜欢
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多