Arrays 在Matlab中计算向量中包含少于3个连续零的元素

Arrays 在Matlab中计算向量中包含少于3个连续零的元素,arrays,matlab,Arrays,Matlab,例如,我有以下向量: A = [34 35 36 0 78 79 0 0 0 80 81 82 84 85 86 102 0 0 0 103 104 105 106 0 0 107 201 0 202 203 204]; A中的每个元素表示每秒一个值。我想计算A=>中包含少于3个连续零的元素,我将获得A的持续时间值(以秒为单位) 在这种情况下,计数在每3个连续零之前停止,在3个连续零之后重新开始,依此类推。是这样的: A = [34->1s 35->2s 36->3s 0-&

例如,我有以下向量:

A = [34 35 36 0 78 79 0 0 0 80 81 82 84 85 86 102 0 0 0 103 104 105 106 0 0 107 201 0 202 203 204];
A中的每个元素表示每秒一个值。我想计算A=>中包含少于3个连续零的元素,我将获得A的持续时间值(以秒为单位)

在这种情况下,计数在每3个连续零之前停止,在3个连续零之后重新开始,依此类推。是这样的:

A = [34->1s 35->2s 36->3s 0->4s 78->5s 79->6s stop 80->1s 81->2s 82->3s 84->4s 85->5s 86->6s 102->7s stop 103->1s 104->2s 105->3s 106->4s 0->5s 0->6s 107->7s 201->8s 0->9s 202->10s 203->11s 204->12s];
Duration = [6 7 12]; in seconds
结果如下:

A = [34->1s 35->2s 36->3s 0->4s 78->5s 79->6s stop 80->1s 81->2s 82->3s 84->4s 85->5s 86->6s 102->7s stop 103->1s 104->2s 105->3s 106->4s 0->5s 0->6s 107->7s 201->8s 0->9s 202->10s 203->11s 204->12s];
Duration = [6 7 12]; in seconds
有人知道吗

A = [34 35 36 0 78 79 0 0 0 80 81 82 84 85 86 102 0 0 0 103 104 105 106 0 0 107 201 0 202 203 204];
count=0;
count2=0;
Duration = [];
for i=1:(size(A,2)-3)
count2=count2+1;
if(A(1,i+1)==0)
    count=count+1;
    if(A(1,i+2)==0)
        count=count+1;
    else
        count=0;
    end
    if(A(1,i+3)==0)
        count=count+1;
    else
        count=0;
    end
    if(count==3)
        Duration = [Duration,count2 ];
        count2=-3;

         end
       else
    count=0;
     end
     end
        Duration = [Duration,count2+3 ];

    Duration

代码检测到3个连续的零,第二个计数器跟踪持续时间。我希望这会有所帮助。

您可以将
A
转换为字符
'0'
'1'
(例如),根据原始值是零还是非零,使用
strsplit
,然后获取每个子字符串的元素数

N=3
为拆分的零数。然后:

Duration = cellfun(@numel, strsplit(char((A>0)+'0'), repmat('0',1,N)));
请注意,上述代码完全基于
N
零进行拆分。例如,
A=[1 2 3 0 0 0 0 4 5]
给出了
持续时间=[3 3]
,因为第四个零被分配给第二个子串

如果要基于
N
或更多的零进行拆分,请使用正则表达式:

Duration = cellfun(@numel, regexp(char((A>0)+'0'), [repmat('0',1,N) '+'], 'split'));
对于
A=[1 2 3 0 0 0 0 4 5]
这就提供了
持续时间=[3 2]

-

样本运行-

>> A
A =
  Columns 1 through 14
     0     0     0     0     0     0     0    34    35    36     0    78    79     0
  Columns 15 through 28
     0     0    80    81    82    84    85    86   102     0     0     0   103   104
  Columns 29 through 38
   105   106     0     0   107   201     0   202   203   204
>> M
M =
  Columns 1 through 14
     0     0     0     0     0     0     0     1     1     1     1     1     1     0
  Columns 15 through 28
     0     0     1     1     1     1     1     1     1     0     0     0     1     1
  Columns 29 through 38
     1     1     1     1     1     1     1     1     1     1
>> Duration
Duration =
     6     7    12

下面是另一个基于矢量化
conv
的备选方案:

Duration = diff([0,find(~conv(A, ones(1,3))),numel(A)+3])-3

如果您转到Fileexchange和grab,您可以使用它来提取所有零元素和非零元素的运行,从而简化搜索

请解释你是如何得到6、7和12的结果的。我看不到输出和数组之间的相关性。我编辑了它。抱歉说得不够清楚。@Bowecho您只是在寻找持续时间吗?如果没有2s、3s或4s,但有5s,会发生什么情况?@Dan每秒计算一次A中的每个元素。因此,对于元素
34、35、36等
我有
second1、second2、second3等
。这就是我所指的。我得到的结果是不正确的。我得到的是
Duration=[71725]
而不是
Duration=[6712]
。代码是检测3个连续的零。设置另一个计数器,当计数=3时重置。我想这会给你你需要的我一开始不理解你的问题,以为这就是你想要的。这就是我一直在寻找的。很好的一行回答。感谢您,我们提供了一种基于
regexp
的方法,以防您希望基于三个或更多的zerosIt进行拆分,这也很成功。感谢@ Luis Mendo给出的例子,考虑<代码> A=(1 2,3,0,0,0,0,4,5)< />代码给出了<代码>持续时间= [3—2 2 ] < /代码>,而不是<代码>持续时间= [Surviv] ,用这个代码。@ Bowecho,如果这是一个需要考虑的情况,那么你需要重新定义你的问题。我还问过你如何处理这样一个案例,比如
a=[34->1s0->2s0->3s0->4s78->5s79->6sStop…
?看起来像
a=[34->1sStop78->1s79->2sStop…]
我不太明白你指的是什么,对不起。