我正在寻找一种方法来检测一系列响应中的错误,记录为整数。正确的系列(即没有错误)由 8 位数字的重复模式组成,重复 28 次。我有兴趣找到缺失数字(因此不完整的目标序列)以及额外数字(因此将数字添加到目标序列中)的实例。
到目前为止,我只是通过运行整个序列并使用if语句来检测整个序列的发生次数,从而查看了正确的8位序列发生的次数,这有助于检测(并可能丢弃)序列的某些部分而没有错误。这可能不是最好/最快/最漂亮的方法,但我认为它有效(编辑: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 素养(正如您可能从上面的例子中猜到的那样),并且对于任何可以防止我遇到最坏情况的指针,即检查长度,丢弃系列中所有不包含错误的序列,并目测剩余序列以识别每个目标中的添加和缺失数字。我希望这实际上是一个基本问题,我只需要找到正确的功能!
提前致谢
使用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) = [];