我已经定义了一个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
答案 0 :(得分:0)
有些逻辑是合理的,但这部分很奇怪:
if(flag==0)
....
elseif(flag==1)
这可能只是else
。更重要的是,可以通过循环的前一部分更改flag的状态,这将使第二个if语句的逻辑无效。
我建议考虑四个场景,重点只计算重复的1:
由于第二个项目符号不会改变标志状态,因此可以先处理;另外两个被认为是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
命令而不是假设数组的长度。