【问题标题】:In MATLAB, how to find indexes in vector every time value change from 1 to 0?在MATLAB中,每次值从1变为0时如何在向量中查找索引?
【发布时间】:2018-08-08 10:16:13
【问题描述】:

我有一个由 1 和 0 组成的向量,表示何时发生间歇性数据信号。例如:

    V = [0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0];

如何找到从 1 到 0 的每个变化的索引值? 所以对于上面的向量V,答案是:

    idx = [10,18,28];

【问题讨论】:

    标签: matlab vector indexing


    【解决方案1】:

    快速简单:

    idx=find(diff(V)<0)+1;
    

    计算导数,只得到负值(从 1 到 0 是 -1)并找到位置。由于导数从第二个位置开始,我们需要添加 1

    但是,请注意,如果您想要访问这些位置上的数据,最好直接使用逻辑索引,如下所示:

    somevals=my_other_data([false;diff(V)<0]);
    

    阅读更多关于通用变量索引here

    【讨论】:

      【解决方案2】:

      strfind 不仅仅是字符串,也适用于像你这样的情况。

      idx = strfind(V,[1 0]) + 1;
      

      【讨论】:

      • 我经常忘记strfind 的多才多艺。
      【解决方案3】:

      你也可以使用卷积:

      idx = find(conv(V,[-1,1])==1);
      

      【讨论】:

        【解决方案4】:

        如果您想要一个适用于“每次值从 x 更改为 y 时的索引”的通用解决方案,请使用这种矢量化方法:

        idx = find( ( V(1:end-1) == x ) & V(2:end) == y ) ) + 1;
        

        你的情况

        idx = find( ( V(1:end-1) == 1 ) & ( V(2:end) == 0 ) ) + 1;
        % >> idx = [10 18 28]
        

        与 Ander 的解决方案一样,如果您将其用于索引,则 find 是不必要的减速,只需使用此

        idx = [false, ( V(1:end-1) == 1 ) & ( V(2:end) == 0 )];
        

        【讨论】:

          【解决方案5】:

          一般来说,您可以使用find 来定位0 和1,并使用intersect 来查找边

          >> intersect(find(V==0), find(V==1)+1)
          ans =
              10    18    28
          

          您可以将 0 和 1 替换为任意值。但是,如果您只处理 0 和 1,则可以将其简化为

          >> intersect(find(~V), find(V)+1)
          ans =
              10    18    28
          

          【讨论】:

            【解决方案6】:

            一种方法是编写一个循环。自从我使用 matlab 以来已经有一段时间了,如果我的语法有点不对,请原谅我,但是与此类似的逻辑应该可以工作:

            给定你的向量 V:

            idx = [];
            for i = 1:(length(V) - 1)
              if (V(i) == 0 && V(i+1) == 1)
                idx = [idx, (i + 1)];
              end
            end
            

            祝你好运!让我知道它是否由于某种原因不起作用。如果您要经常执行此操作,您可能也应该编写一个函数。

            【讨论】:

            • 这可行,但绝对不是 MATLAB 中最简单的方法。这对 C 有好处
            • 这个精确的逻辑can be vectorised,充分利用原生 MATLAB 功能!
            猜你喜欢
            • 1970-01-01
            • 2019-04-13
            • 2023-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多