Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab/Octave中识别(和删除)向量序列_Matlab_Octave - Fatal编程技术网

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

在Matlab/Octave中识别(和删除)向量序列,matlab,octave,Matlab,Octave,我试图从Matlab中的数字向量(或倍频程)中删减任何长度为3或更多的序列。例如,给定向量数据集 删除长度为3或3以上的所有序列将生成prunedDataSet: prunedDataSet = [7 9 11 13 22 28 30 31 ]; 我可以强制执行一个解决方案,但我怀疑有一种更简洁(也许更有效)的方法可以使用向量/矩阵运算来执行,但我总是搞不清楚某个东西是生成索引还是生成该索引处的值。建议 下面是我想出的暴力方法: dataSet = [1 2 3 7 9 11 13 17 18

我试图从Matlab中的数字向量(或倍频程)中删减任何长度为3或更多的序列。例如,给定向量数据集

删除长度为3或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));

下面是一个使用向量矩阵表示法的尝试:

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+1
之前出现数字
a
的所有位置
s2
适用于
a
出现在
a+2
前面两个位置的所有位置。然后
s
在满足上述两个条件的情况下变为真。然后,我们构建
s
,使每个真值都传播到它的两个后继值

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

这里有一个使用and的解决方案


你需要更精确地理解长度为3的任何序列的含义。。。你是说任何
k
都只能
k,k+1,k+2
,还是
k,k-1,k-2
也可以包括在内?关于
k,±m,k±2m
或者像
k,k^2,k^3
或者
k,k*a,k*a^2
等几何序列呢?对不起,我认为从数据集/删减数据集可以明显看出,我给出的“蛮力法”是确定的:k,k+1,k+2。我理解你的例子。然而,不清楚的是第一行中的“任何序列”一词。不管怎么说,我想你下面确实有很好的解决方案,所以不用担心。
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)
%# 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