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

Arrays 从数组中提取模式和后续的n个元素,并计算出现的次数,arrays,matlab,matrix,Arrays,Matlab,Matrix,我有一系列类似这样的双打: 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个值 在找到A,B之后,如果我想找到数组C中每个数组的出现次数,我该怎么做呢 indices = cellfun(@(c) strfind(c,pattern),

我有一系列类似这样的双打:

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个值

在找到A,B之后,如果我想找到数组C中每个数组的出现次数,我该怎么做呢

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

谢谢

假设您对单元阵列输出没有问题,那么这可以正常工作:

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
在模式
p
最后一次出现后以至少
n
个元素结束,则可以使用缩写形式:

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


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

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,:);

对于上面提到的问题,它可以工作(+1)。但是,你能不能更一般一些,这样当向量以
p
结尾时它也能工作:
C=[1 2 3 4 0 3 2 5 6 7 1 2 3 4]
@John在这种情况下,最后一个模式应该被忽略?但它为我返回了一个错误:@(x)C(x:x+n+numel(p)-1)中的错误。John看看我的数组谢谢你的修改,我认为新的解决方案是最优的。
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,:);