【问题标题】:Identifying (and removing) sequences from a vector in Matlab/Octave在 Matlab/Octave 中从向量中识别(和删除)序列
【发布时间】: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^3k,k*a,k*a^2 等几何序列呢?
  • 对不起,我认为从 dataSet/prunedDataSet 中很明显,并且我给出的“蛮力方法”是确定的:k,k+1,k+2。
  • 我理解你的例子。然而,不清楚的是第一行中的术语any sequence。无论如何,我想您在下面确实有很好的解决方案,所以不用担心。

标签: matlab octave


【解决方案1】:

这是使用DIFFSTRFIND 的解决方案

%# 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

【讨论】:

    【解决方案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)
    

    这个想法是:s1 适用于所有在a+1 之前出现数字a 的位置。 s2 对于aa+2 之前出现两个位置的所有位置都为真。然后s 在满足前面两个条件的情况下变为真。然后,我们构建s,这样每个真实值都会传播给它的两个后继者。

    最后,dataSet(~s) 保留所有上述条件为假的值,即保留不属于 3 序列的数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多