在没有循环的数组中查找4个值的序列

时间:2014-11-21 17:30:36

标签: arrays matlab

我正在尝试在没有forif的数组中找到一系列升序值(4个值)。 例如,A = [8 9 1 3 7 18 9],输入将是:1 3 7 18

没有for的任何方式吗?

3 个答案:

答案 0 :(得分:3)

另一种解决方案:

A = [8 9 1 3 7 18 9 10 11 12 5];
len = 4;

subseqs = hankel(A(1:len), A(len:end));
idx = all(diff(subseqs) > 0);
out = subseqs(:,idx);

答案 1 :(得分:2)

strfind不仅可以查找字符串中的模式,还可以查找数字数组中的模式。您正在寻找的模式是三个连续的正差异:

A = [8 9 1 3 7 18 19]

sequenceLength = 4;

startIdx = strfind( sign(diff(A)), ones(1,sequenceLength-1));

sequences = A(bsxfun(@plus,startIdx',0:sequenceLength-1))

sequences =

     1     3     7    18
     3     7    18    19

注意:strfind找到重叠的间隔。如果您想要独占间隔,可能需要查看regexp

答案 2 :(得分:1)

这将为您提供所有此类子序列的起始索引:

n = 4;
indices = find(conv(double(diff(A)>0), ones(1,n-1), 'valid')==n-1);

示例:

A = [8 9 1 3 7 18 9 10 11 12 5];

产生

indices =
     3     7

因此子序列为A(indices(1) + (0:n-1))A(indices(2) + (0:n-1))等:

>> A(indices(1) + (0:n-1))
ans =
     1     3     7    18

>> A(indices(2) + (0:n-1))
ans =
     9    10    11    12