【问题标题】:Find upper bound index in sorted vector在排序向量中查找上限索引
【发布时间】:2012-10-03 00:09:06
【问题描述】:

我在 Matlab 中有一个如下所示的向量。

第 1 至 4 列 0.160000000000000 0.208000000000000 0.244000000000000 0.268000000000000 第 5 栏 0.280000000000000

我想找到以下值的上限索引:

0.16230400000000

我知道这个值介于 1° 和 2° 索引之间,但我想找到在这种情况下为索引 2 的上限,即使最接近的值位于索引 1。我如何在 Matlab 中得到它没有循环?

我找到了以下方法来找到最接近的值,但我总是需要上限。

[c ind] = min(abs(probCum-codComp));

【问题讨论】:

  • 那里有错误吗?您搜索的值不大于,但小于 vector(1)。
  • 你是说 0.106230400000000 介于 0.160000000000000 和 0.208000000000000 之间?!
  • 对不起,我又加了一个额外的零检查我的问题 pelase

标签: matlab vector


【解决方案1】:

你可以通过统计有多少条目小于感兴趣的值加一来获得上界的索引:

id = sum(value < data)+1; 

请注意,如果所有元素都小于感兴趣的值,data(id) 将返回错误,因为id 大于data 的大小。

【讨论】:

  • 我认为你需要 +1,但其他方面很好。
  • @angainor:是的,已经注意到了。当您发表评论时,编辑刚刚开始。无论如何,谢谢...
【解决方案2】:

如果你的数组是按升序排列的,那么 find 命令就特别强大:

find (a>0.162,1)

【讨论】:

    【解决方案3】:

    您可以从向量中减去您搜索的值并观察符号

    V =  [0.1600    0.2080    0.2440    0.2680    0.2800];
    v =  0.162304;
    V-v
    ans =
    
    -0.0023    0.0457    0.0817    0.1057    0.1177
    

    现在你可以find这个向量中的第一个非负条目 - 这是你的上限

    find(V-v>=0, 1, 'first')
    ans =
    
     2
    

    您还可以更改上述表达式中的不等式以满足您的需要。

    【讨论】:

      【解决方案4】:

      您可以使用min 的第二个输出来获取“正确”索引的索引:

      [~,index] = min(abs(data-value));
      

      然后检查是下还是上,并相应地调整index

      if value > data(index)  
          index = min(length(data), index+1); end
      

      【讨论】:

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