检测整数序列中的缺失和额外数字

时间:2017-04-13 10:34:23

标签: matlab vector compare sequence matching

我正在寻找一种方法来检测一系列响应中的错误,记录为整数。正确的系列(即没有错误)由8位数的重复模式组成,重复28次。我有兴趣找到缺失数字的实例(如此不完整的目标序列)以及额外的数字(因此数字被添加到目标序列中)。

到目前为止,我刚刚查看了正确的8位序列发生的次数,通过贯穿整个系列并使用if语句来检测整个序列的发生,这有助于检测(& ;可能丢弃)系列的部分没有错误。它可能不是最佳/最快/最漂亮的方式,但我认为它有效(编辑:strfind显然是一个更优雅的选择)。直接比较矢量似乎很难,因为它们可能有不同的大小(虽然我当然很好奇,如果有解决方案的话)。

所以,让我们说目标序列是[24341123],完整系列是一个数字向量,全部在1和4之间,名为resp(长度约为210-230位,8 * 28 = 224如果他们是完美的)。

correctsequences=0
for t=1:(numel(resp-8))
if resp(t)==2 && resp(t+1)==4 && resp(t+2)==3 && resp(t+3)==4 && resp(t+4)==1 && resp(t+5)==1 && resp(t+6)==2 && resp(t+7)==3; 
correctsequences=correctsequences+1
end end

所以只有在序列中没有错误时这才足够,但如果目标之间有额外的数字,那么它们就已经错过了。

我一直在寻找一种方法来查找系列中重复出现的目标序列中的缺失和额外数字,一些查询导致我使用正则表达式方法(我根本不知道),或只是匹配序列而不是而不是找到偏差,正如我在上面所做的那样。

理想情况下,我需要的是能够计算每种类型的错误(缺失和额外)的东西,但我已经很高兴得到两者的组合分数。我只有非常基本的matlab读写能力(正如你可能从上面的例子中猜到的那样)并且会感激任何会阻止我出现最糟糕情况的指针,即只是检查长度,丢弃包含在系列中的所有序列没有错误,并且注意剩下的序列以识别每个目标中的添加和缺失数字。我希望这实际上是一个基本问题,我只需要找到正确的函数!

提前致谢

1 个答案:

答案 0 :(得分:0)

使用strfind

target = [2 4 3 4 1 1 2 3];
% generate sequences
resp1 = repmat(target,[1 28]);
resp2 = [randi(4,[1 20]) resp1 randi(4,[1 10])];
resp3 = [repmat(target,[1 27]) randi(4,[1 8])];
% find all sequences of target
k1 = strfind(resp1,target);
k2 = strfind(resp2,target);
k3 = strfind(resp3,target);
% find 28 sequences?
found1 = isequal(diff(k1),8*ones(1,27)); % true
found2 = isequal(diff(k2),8*ones(1,27)); % true
found3 = isequal(diff(k3),8*ones(1,27)); % false
% find extras
kk1 = bsxfun(@plus,k1,(0:7)');
kk1 = kk1(:)';
extraIdxs1 = 1:numel(resp1);
extraIdxs1(kk1) = [];
kk2 = bsxfun(@plus,k2,(0:7)');
kk2 = kk2(:)';
extraIdxs2 = 1:numel(resp2);
extraIdxs2(kk2) = [];
kk3 = bsxfun(@plus,k3,(0:7)');
kk3 = kk3(:)';
extraIdxs3 = 1:numel(resp3);
extraIdxs3(kk3) = [];