【发布时间】: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];
【问题讨论】:
我有一个由 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];
【问题讨论】:
快速简单:
idx=find(diff(V)<0)+1;
计算导数,只得到负值(从 1 到 0 是 -1)并找到位置。由于导数从第二个位置开始,我们需要添加 1
但是,请注意,如果您想要访问这些位置上的数据,最好直接使用逻辑索引,如下所示:
somevals=my_other_data([false;diff(V)<0]);
阅读更多关于通用变量索引here
【讨论】:
strfind 不仅仅是字符串,也适用于像你这样的情况。
idx = strfind(V,[1 0]) + 1;
【讨论】:
strfind 的多才多艺。
你也可以使用卷积:
idx = find(conv(V,[-1,1])==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 )];
【讨论】:
一般来说,您可以使用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
【讨论】:
一种方法是编写一个循环。自从我使用 matlab 以来已经有一段时间了,如果我的语法有点不对,请原谅我,但是与此类似的逻辑应该可以工作:
给定你的向量 V:
idx = [];
for i = 1:(length(V) - 1)
if (V(i) == 0 && V(i+1) == 1)
idx = [idx, (i + 1)];
end
end
祝你好运!让我知道它是否由于某种原因不起作用。如果您要经常执行此操作,您可能也应该编写一个函数。
【讨论】: