【发布时间】:2011-09-03 16:49:36
【问题描述】:
我正在尝试从 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));
【问题讨论】:
-
您需要更准确地了解 任何长度为 3 的序列的含义...您的意思是仅
k,k+1,k+2对任何k还是 @987654326 @也被列入?k,±m,k±2m或者类似k,k^2,k^3或k,k*a,k*a^2等几何序列呢? -
对不起,我认为从 dataSet/prunedDataSet 中很明显,并且我给出的“蛮力方法”是确定的:k,k+1,k+2。
-
我理解你的例子。然而,不清楚的是第一行中的术语any sequence。无论如何,我想您在下面确实有很好的解决方案,所以不用担心。