我正在尝试在没有for
或if
的数组中找到一系列升序值(4个值)。
例如,A = [8 9 1 3 7 18 9],输入将是:1 3 7 18
。
没有for
的任何方式吗?
答案 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