从Matlab/Octave中的矢量中识别(并删除)序列

我试图从Matlab(或Octave)中的数字矢量中删除任何长度为3或更长的序列。例如,给定的矢量数据集,从Matlab/Octave中的矢量中识别(并删除)序列

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)

的理念是:s1是所有职位如此,其中一些a出现在a+1之前。 s2对于a出现在a+2之前的两个位置的所有仓位均为真。然后s在满足前面的条件时变为真。然后,我们构建s,以便将每个真实值传播给它的两个后继者。

最后,dataSet(~s)保留上述条件为假的所有值,也就是说,它保留的数字不是3序列的一部分。

以上是 从Matlab/Octave中的矢量中识别(并删除)序列 的全部内容, 来源链接: utcz.com/qa/260500.html

回到顶部