Check appearance counts of multiple patters in a cell matrix

1 view (last 30 days)
I have 2 cell matrixs:
A =
m×1 cell array
{'abc'}
{'def'}
{'123'}
......
B =
n×1 cell array
{'abcsafadefs2'}
{'dsabcdsdef11'}
{'abcssp123'}
......
I want a output matrix of whether patterns in A has appear 7 times in B:
C =
m×1 logical array
{true}
{true}
{false}
......
So in this example pattern "abc" have matches in exactaly 7 elements in B, so does "def", but not "123".
I now do this with a for loop
for i=1:length(A)
C(i)= (nnz(contains({B}, A(i)))==7);
end
Any way to vectorize the code?

Accepted Answer

Guillaume
Guillaume on 8 Jan 2020
Any way to vectorize the code?
Not really, you could cellfun it, but that's not vectorisation (cellfun is just a loop in disguise):
C = cellfun(@(a) nnz(contains(B, a)) == 7, A);
Note that if you use a loop, you should preallocate the output:
C = false(size(A));
for i = 1:numel(A)
C(i) = ...
end
  4 Comments
Yi-xiao Liu
Yi-xiao Liu on 8 Jan 2020
Edited: Yi-xiao Liu on 8 Jan 2020
Can you explain more on the example? I find myself having hard time understanding it, though it does work
Guillaume
Guillaume on 9 Jan 2020
cellfun(fun, A) applies the function fun to each element of A. Here, fun is the anonymous function:
@(a) nnz(contains(B, a)) == 7
which written as normal function would be equivalent to:
function out = anonymous_function(a)
%unlike normal functions, anonymous functions can capture variables in the enclosing function
%so B is in scope in the anonymous function
out = nnz(contains(B, a)) == 7;
end
which is basically the code you had originally.

Sign in to comment.

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products


Release

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!