Matlab 检测整数序列中的缺失数和多余数

Matlab 检测整数序列中的缺失数和多余数,matlab,vector,compare,sequence,matching,Matlab,Vector,Compare,Sequence,Matching,我正在寻找一种方法来检测一系列响应中的错误,这些响应记录为整数。正确的序列(即无错误)由8位重复模式组成,重复28次。我感兴趣的是寻找缺失数字(如此不完整的目标序列)以及额外数字(如此添加到目标序列中的数字)的实例 到目前为止,我刚刚通过运行整个序列并使用if语句检测整个序列的出现,查看了正确的8位序列出现的次数,这有助于检测(可能会丢弃)序列中没有错误的部分。这可能不是最好/最快/最漂亮的方法,但我认为它很有效(编辑:strfind显然是一个更优雅的选项)。直接比较向量似乎很难,因为它们可能有

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

到目前为止,我刚刚通过运行整个序列并使用if语句检测整个序列的出现,查看了正确的8位序列出现的次数,这有助于检测(可能会丢弃)序列中没有错误的部分。这可能不是最好/最快/最漂亮的方法,但我认为它很有效(编辑:strfind显然是一个更优雅的选项)。直接比较向量似乎很难,因为它们可能有不同的大小(当然,我很好奇是否有解决方案)

假设目标序列是[24341123],完整序列是一个数字向量,都在1到4之间,名为resp(长度约为210-230位,如果它们是完美的,则8*28=224)

因此,只有在序列中没有错误的情况下,这就足够了,但是如果目标之间有额外的数字,它们就会丢失

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

理想情况下,我需要的是能让我对每种类型的错误(遗漏和额外)进行计数的东西,但我已经很高兴能得到这两种错误的综合分数。我只有非常基本的matlab素养(你可能已经从上面的例子中猜到了),如果有任何指针可以阻止我的最坏情况,也就是只检查长度,丢弃序列中所有不包含错误的序列,以及观察剩余序列,以识别每个目标中增加和丢失的数字。。我希望这实际上是一个基本问题,我只需要找到正确的函数


提前感谢

使用
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) = [];

使用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) = [];

谢谢显然,strfind是检测完整序列的更好方法。:)据我所知,代码的其余部分(来自“find extras”)定位了所有剩余的元素,ExtraIDX作为索引,对吗?我所寻找的是一种计算resp序列中错误的方法,因此如果目标序列中有一个丢失或多余的数字,这将以某种方式被标记。除非我在这段代码中遗漏了什么,否则“extras”现在仍然需要通过肉眼检查来发现错误,对吗?您可以执行
length(extraIdxs)
来检测额外的位数。关于缺少的数字-它没有很好的定义您的意思是什么,您能举一个例子说明一个
目标
和一个
响应
缺少一个数字吗?啊,为不明确表示歉意。如果在序列中的某个位置出现以下情况,则会有一个额外的数字:。。。2 4 3 3 4 1 1 2 3 ... -> 一种目标序列,其中增加了一个额外的数字,从而计算出一个额外的数字。类似地,丢失的数字也会出现类似的情况:…2 4 3 1 2 3…->一个缺少一个数字的目标序列。我不是将一个正确序列中的剩余数字归类为错误,而是试图找到一种方法来检测与目标序列的偏差数量。我可以尝试strfind来增加部分正确目标的长度(从开始或结束,或者可能使用通配符?),或者查找特定数字对连续出现的实例,或者类似的情况。。。但这就是我的想法结束的地方!谢谢显然,strfind是检测完整序列的更好方法。:)据我所知,代码的其余部分(来自“find extras”)定位了所有剩余的元素,ExtraIDX作为索引,对吗?我所寻找的是一种计算resp序列中错误的方法,因此如果目标序列中有一个丢失或多余的数字,这将以某种方式被标记。除非我在这段代码中遗漏了什么,否则“extras”现在仍然需要通过肉眼检查来发现错误,对吗?您可以执行
length(extraIdxs)
来检测额外的位数。关于缺少的数字-它没有很好的定义您的意思是什么,您能举一个例子说明一个
目标
和一个
响应
缺少一个数字吗?啊,为不明确表示歉意。如果在序列中的某个位置出现以下情况,则会有一个额外的数字:。。。2 4 3 3 4 1 1 2 3 ... -> 一种目标序列,其中增加了一个额外的数字,从而计算出一个额外的数字。类似地,丢失的数字也会出现类似的情况:…2 4 3 1 2 3…->一个缺少一个数字的目标序列。我不是将一个正确序列中的剩余数字归类为错误,而是试图找到一种方法来检测与目标序列的偏差数量。我可以尝试strfind来增加部分正确目标的长度(从开始或结束,或者可能使用通配符?),或者查找特定数字对连续出现的实例,或者类似的情况。。。但这就是我的想法结束的地方!