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