我想找到长度大于2的双序列(10位数据,这里不需要)。 某些元素的双重序列可以用两个索引here编号。 示例数据是
data = [ 4.123456 4.123456 4.123456 4.123456 7.123456 1.123456 1.123456 1.123456 ]
预期输出为
{[4.123456 4.123456 4.123456 4.123456], [1.123456 1.123456 1.123456]}
我对hankel
这样的转换感兴趣,因为在here的答案{em}中找到了关于在没有循环的数组中找到4个值的序列并描述了{{3} J. Layman很好。 Hankel提供了序列的变换,其矩阵的行列式是 Catalecticant ,其中后者属性是可以在这里使用的属性。它可以表征双序列的两个指数。
这里的问题是我们是否可以表征给定序列的Hankel决定因素。我认为这可能是不可能的。
data
转换为方阵并使用两个索引来表示双精度。 counter
。counter
。 如何在数据中找到双序列?
答案 0 :(得分:2)
我解决问题的方法,假设我理解正确:
x = [9 1 5 6 6 6 5 1 1 0 7 7 7 7 7 8];
d = diff(diff([0 x 0]) == 0);
y = arrayfun(@(i,j) x(i:j), find(d>0), find(d<0), 'Uniform',false);
celldisp(y)
此示例的结果:
x =
9 1 5 6 6 6 5 1 1 0 7 7 7 7 7 8
y =
[1x3 double] [1x2 double] [1x5 double]
y{1} =
6 6 6
y{2} =
1 1
y{3} =
7 7 7 7 7
答案 1 :(得分:1)
我可能只是尝试识别连续的重复项并为每个重复项分配一个索引。然后,您可以确定每组中有多少项目,只保留您关心的项目。
%// Desired minimum length
minlen = 2;
%// Assign a unique index to each consecutive repeated value
index = cumsum([0 diff(data)] ~= 0);
%// Then group them
inds = 0:max(index);
nPerGroup = histc(index, inds);
%// Figure out which to keep
inds2keep = inds(nPerGroup > minlen);
%// Then create a cell array
values = arrayfun(@(x)data(index == x), inds2keep, 'uni', 0);
%// And just to check
celldisp(values)
values{1} =
4.1235 4.1235 4.1235 4.1235
values{2} =
1.1235 1.1235 1.1235
另一种方法可以避免使用histc
:
index = cumsum([0 diff(data)] ~= 0);
values = arrayfun(@(x)data(index == x), 0:max(index), 'uni', 0);
tokeep = cellfun(@(x)numel(x) >= minlen, values);
values = values(tokeep);