计算数组中连续1的运行频率

时间:2015-04-08 15:53:42

标签: scilab

我已经定义了一个arr=[0 0 1 1 1 0 0 0 0 1 1 0 1 1 1]的数组。

我想计算连续重复并存储在另一个数组中。

例如,上面的第一次重复是1的3。所以我假设连续重复的长度是3。

因此,数组应该像arr [length] = 1。 1代表它遇到过一次。最终输出应为

arr [3] = 2 //这意味着重复的时间长度已经遇到过3次中的3次

arr [2] = 1 //曾经遇到过2次重复的长度。

以下是我目前的代码进度。

err=0;
no_err=0;
flag=0;

arr=[0 0 1 1 1 0 0 0 0 1 1 0 1 1 1] //assume 15
for x=1:15;
val=arr(x);//access array values
if(val==0)//if no error
flag=0; //indicates no error
elseif(val==1) //if there is an error
flag=1; //indicates error
end
if(flag==0)
no_err=no_err+1;//counter of no error
err=0; //reset error to zero
elseif(flag==1)//
err=err+1;//
tmperr=err;//will keep updating with latest err count length
end
end

1 个答案:

答案 0 :(得分:0)

有些逻辑是合理的,但这部分很奇怪:

if(flag==0)
 ....
elseif(flag==1)

这可能只是else。更重要的是,可以通过循环的前一部分更改flag的状态,这将使第二个if语句的逻辑无效。

我建议考虑四个场景,重点只计算重复的1:

  • flag为0且值为0:什么都不做(不需要为此设置子句)
  • 标志为1且值为1:递增连续1的计数
  • 标志为0且值为1:将标志设置为1,将连续1的计数设置为1.
  • 标志为1且值为0:将标志设置为0,记录输出数组中的1s计数。

由于第二个项目符号不会改变标志状态,因此可以先处理;另外两个被认为是if / elseif构造。

此外,数组的结尾应该结束当前的1s运行。不是为此编写单独的子句,而是使用0填充给定数组更容易。

err=0
flag=0

arr=[0 0 1 1 1 0 0 0 0 1 1 0 1 1 1]
output = zeros(arr)
paddedarr = [arr 0] 
for x=1:length(paddedarr)
    val=paddedarr(x) 
    if (val==1 & flag==1)
      err=err+1
    end
    if (val==1 & flag==0) 
      flag = 1
      err = 1
    elseif (val==0 & flag==1) 
      output(err) = output(err)+1
      flag = 0
      err = 0
  end
end

输出:

0.    1.    2.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0. 

请注意,我使用length命令而不是假设数组的长度。