在MATLAB中,如何在每次值从1变为0时在向量中找到索引?

时间:2018-08-08 10:16:13

标签: matlab vector indexing

我有一个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];

6 个答案:

答案 0 :(得分:7)

快速简便:

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

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

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

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

详细了解通用变量索引here

答案 1 :(得分:6)

strfind不只是字符串,还适用于您的情况。

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

答案 2 :(得分:2)

您还可以使用卷积:

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

答案 3 :(得分:1)

如果您想要一个通用的解决方案,该解决方案适用于“每次值从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 )];

答案 4 :(得分:1)

通常,您可以使用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

答案 5 :(得分:0)

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

给出向量V:

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

祝你好运!让我知道它是否由于某种原因无法正常工作。如果您打算大量执行此操作,则可能也应该编写一个函数。