Check appearance counts of multiple patters in a cell matrix
    6 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Yi-xiao Liu
 el 8 de En. de 2020
  
    
    
    
    
    Comentada: Guillaume
      
      
 el 9 de En. de 2020
            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 comentarios
Respuesta aceptada
  Guillaume
      
      
 el 8 de En. de 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 comentarios
  Guillaume
      
      
 el 9 de En. de 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.
Más respuestas (0)
Ver también
Categorías
				Más información sobre Loops and Conditional Statements en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
