Check appearance counts of multiple patters in a cell matrix
2 次查看(过去 30 天)
显示 更早的评论
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?
0 个评论
采纳的回答
Guillaume
2020-1-8
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 个评论
Guillaume
2020-1-9
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.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!