代码之家  ›  专栏  ›  技术社区  ›  lighting

从数组中提取模式和后续n个元素,并计算出现次数

  •  3
  • lighting  · 技术社区  · 7 年前

    C = [1 2 3 4 0 3 2 5 6 7 1 2 3 4 150 30]
    

    我想在数组中找到模式[1 2 3 4],然后用它存储该模式后的2个值,如下所示:

    A = [1 2 3 4 0 3]
    B = [1 2 3 4 150 30]
    

    我可以找到这样的模式,但我不知道如何获取和存储之前的2个值。

    indices = cellfun(@(c) strfind(c,pattern), C, 'UniformOutput', false);
    

    谢谢

    2 回复  |  直到 7 年前
        1
  •  3
  •   Robert Seifert    7 年前

    假设您对单元阵列输出很满意,那么这很好:

    C = [1 2 3 4 0 3 2 5 6 7 1 2 3 4 150 30 42 1 2 3 4 0 3]
    p = [1 2 3 4]
    n = 2
    
    % full patttern length - 1
    dn = numel(p) + n - 1
    
    %// find indices
    ind = strfind(C,p)
    
    %// pre check if pattern at end of array
    if ind(end)+ dn  > numel(C), k = -1; else k = 0; end
    
    %// extracting
    temp = arrayfun(@(x) C(x:x+dn), ind(1:end+k) , 'uni', 0)
    
    %// post processing
    [out, ~, idx] = unique(vertcat(temp{:}),'rows','stable')
    occ = histcounts(idx).'
    

    如果阵列 C 以至少结束 n 图案最后一次出现后的元素 p ,您可以使用缩写形式:

    out = arrayfun(@(x) C(x:x+n+numel(p)-1), strfind(C,p) , 'uni', 0)
    

    out =
    
         1     2     3     4     0     3
         1     2     3     4   150    30
    
    occ =
    
         2
         1
    
        2
  •  0
  •   OmG    7 年前

    一个简单的解决方案可以是:

    C = [1 2 3 4 0 3 2 5 6 7 1 2 3 4 150 30];
    pattern = [1 2 3 4];
    numberOfAddition = 2;
    outputs = zeros(length(A),length(pattern)+ numberOfAddition); % preallocation
    numberOfFoundPattern =  1;
    lengthOfConsider = length(C) - length(pattern) - numberOfAddition;
    for i = 1:lengthOfConsider 
         if(sum(C(i:i+length(pattern)) - pattern) == 0) % find pattern
             outputs(numberOfFoundPattern,:) = C(i:i+length(pattern)+numberOfAddition);
             numberOfFoundPattern = numberOfFoundPattern + 1;
         end
    end
    outputs = outputs(1:numberOfFoundPattern - 1,:);