我有一系列像这样的双打:
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);
谢谢!
答案 0 :(得分:3)
假设您对单元格数组输出没问题,这可以正常工作:
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
答案 1 :(得分: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,:);