在Matlab中使用变换查找双序列?

时间:2016-03-31 17:25:07

标签: arrays matlab

我想找到长度大于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方法

我对hankel这样的转换感兴趣,因为在here的答案{em}中找到了关于在没有循环的数组中找到4个值的序列并描述了{{3} J. Layman很好。 Hankel提供了序列的变换,其矩阵的行列式是 Catalecticant ,其中后者属性是可以在这里使用的属性。它可以表征双序列的两个指数。

这里的问题是我们是否可以表征给定序列的Hankel决定因素。我认为这可能是不可能的。

不完整的伪代码

  1. data转换为方阵并使用两个索引来表示双精度。
  2. 循环第一个索引。
  3. 循环第二个索引。
    1. 如果两个向量(第一个和第二个索引)相同,则设置counter
    2. 如果预期第三个向量不是前两个,则重置counter
    3. 回到(1)。
    4. 数据结束时结束。
  4. 如何在数据中找到双序列?

2 个答案:

答案 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);