【问题标题】:Find specific occurrences within a vector in MATLAB, without for-loop?在MATLAB中查找向量中的特定事件,没有for循环?
【发布时间】:2013-06-09 05:14:34
【问题描述】:

我有一个看起来很简单的问题,但也许我遗漏了一些东西。假设我有:vector = [10:1:19];。我有另一个向量,want = [11 16 19]; 我只是想要一种命令为我返回的方式,即向量中出现 11、16 和 19 的索引。换句话说,我想返回 2、7 和 10。什么命令可以做到这一点?我不能使用find,(因为尺寸不匹配),还有其他方法吗?

实际上vectorwant 的长度会很长,所以for 循环是不行的。

【问题讨论】:

    标签: matlab for-loop vector vectorization


    【解决方案1】:

    使用intersect:

    [C, i_vector, i_want] = intersect(vector, want)
    

    C 是两个向量中的共同元素。 i_vectorvector 中的公共集索引,i_wantwant 向量中的匹配集索引。

    【讨论】:

    • 谢谢!我对此一无所知。顺便说一句,MATLAB 如何使这个命令运行得非常快?幕后发生了什么?肯定没有 for 循环吧?
    • @Learnaholic 结构良好的 for 循环可以非常快。 MatLab 也只是针对矩阵进行了优化。
    • @Learnaholic:还有很多 Matlab 内置函数经过优化和预编译,如果我没记错的话,这有时会提高速度。
    • @pm89,是的,虽然我想知道即使是预编译的,如何优化 for 循环...
    【解决方案2】:

    或者,您可以使用ismember

    要获取vector 的元素存在于want

    vector(ismember(vector,want))
    ans =
         11     16    19
    

    获取他们的索引:

    find(ismember(vector,want))
    ans =
         2     7    10
    

    或者只是:

    [tf, loc] = ismember(vector,want)
    tf =
         0     1     0     0     0     0     1     0     0     1
    loc =
         0     1     0     0     0     0     2     0     0     3
    

    其中tf表示vector的每个元素是否存在于want中,loc表示want中对应的索引。

    【讨论】:

      猜你喜欢
      • 2017-11-09
      • 2022-10-18
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多