在Matlab / Octave中从向量中识别(并删除)序列

|| 我正在尝试从Matlab(或Octave)中的数字向量中修剪长度为3或更大的任何序列。例如,给定向量dataSet,
dataSet = [1 2 3 7 9 11 13 17 18 19 20 22 24 25 26 28 30 31];
删除所有长度为3或更大的序列将产生prunedDataSet:
prunedDataSet = [7 9 11 13 22 28 30 31 ];
我可以蛮力解决,但是我怀疑使用向量/矩阵运算可以更简洁(也许更有效),但是我总是对某个东西是产生索引还是该索引的值感到困惑。有什么建议吗? 这是我想出的蛮力方法:
dataSet = [1 2 3 7 9 11 13 17 18 19 20 22 24 25 26 28 30 31];
benign = [];
for i = 1:size(dataSet,2)-2;
    if (dataSet(i) == (dataSet(i+1)-1) && dataSet(i) == dataSet(i+2)-2);
        benign = [benign i ] ;
    end;
end;

remove = [];
for i = 1:size(benign,2);
    remove = [remove benign(i) benign(i)+1 benign(i)+2 ];
end;

remove = unique(remove);

prunedDataSet = setdiff(dataSet, dataSet(remove));
    
已邀请:
        这是使用DIFF和STRFIND的解决方案
%# define dataset
dataSet = [1 2 3 7 9 11 13 17 18 19 20 22 24 25 26 28 30 31];

%# take the difference. Whatever is part of a sequence will have difference 1
dds = diff(dataSet);

%# sequences of 3 lead to two consecutive ones. Sequences of 4 are like two sequences of 3
seqIdx = findstr(dds,[1 1]);

%# remove start, start+1, start+2
dataSet(bsxfun(@plus,seqIdx,[0;1;2])) = []
dataSet =

     7     9    11    13    22    28    30    31
    
        这是使用向量矩阵表示法的尝试:
s1 = [(dataSet(1:end-1) == dataSet(2:end)-1), false];
s2 = [(dataSet(1:end-2) == dataSet(3:end)-2), false, false];
s3 = s1 & s2;
s = s3 | [false, s3(1:end-1)] | [false, false, s3(1:end-2)];
dataSet(~s)
这个想法是:对于在数字7之前出现数字6的所有位置,数字5都是正确的。对于所有位置,当“ 6”出现在“ 10”之前两个位置时,“ 8”为真。当前面两个条件都满足时,ѭ11变为真。然后,我们构建ѭ11,以便将每个真实值传播给它的两个后继。 最后,
dataSet(~s)
保留所有上述条件为假的值,即,保留不属于3序列的数字。     

要回复问题请先登录注册