find multiple words in a cell

2 views (last 30 days)
Hi, is there a way to compare and return a number for the matching words in two unequal cells?
A={'a','a','a','b','b','d'} B={'a','b','c','d','e','f','g','h'}
return C=3,2,0,1,0,0,0,0
Thank you

Accepted Answer

Ryan Livingston
Ryan Livingston on 9 Jan 2013
A one-liner:
cellfun(@(x)sum(ismember(A,x)), B)
  1 Comment
Vincent I
Vincent I on 9 Jan 2013
Fantastic, thank you . thats what I was looking for

Sign in to comment.

More Answers (3)

Matt J
Matt J on 9 Jan 2013
If the "words" will really always be single letters, you could do it looplessly with
>> histc([A{:}], [B{:}])
ans =
3 2 0 1 0 0 0 0
Jan on 10 Jan 2013
Edited: Jan on 10 Jan 2013
The decision is easy:
New question, new thread.
Additional information to an existing question is added by editing the question and marking the changes by "[EDITED]". Then this is clarification and *not* a new question.
Hiding important information in deeply nested comments to already accepted questions is a bad idea.

Sign in to comment.

Daniel Shub
Daniel Shub on 9 Jan 2013
I am sure that this is over thinking the solution and I doubt that using regexp is optimal, but I was curious how bad it would be.
x = regexp(A, cell2mat(cellfun(@(x)['(?<', x, '>', x, ')|'], B, 'UniformOutput', false)), 'names');
cellfun(@(x)length([y.(x)]), fieldnames([x{:}]))'
I is there a better way to do this with regexp?
  1 Comment
Vincent I
Vincent I on 9 Jan 2013
Edited: Vincent I on 9 Jan 2013
Solved my problem by doing the folowing:
A=regexprep(A, ' ','');
A=regexprep(A, '_(\w*)','');
C=cellfun(@(x)sum(strcmp(A, x)), B);
Thank you

Sign in to comment.

Jan on 10 Jan 2013
[EDITED, Jan, moved from comments to the accepted question]
ISMEMBER sorts the inputs and performs a binary search. This can be much faster and much slower than an unsorted comparison by:
cellfun(@(x)sum(strcmp(A, x)), B)
I claim without a proof, that a loop is faster:
R = zeros(1, numel(B));
for iB = 1:numel(B)
R(iB) = sum(strcmp(A, B{iB}));
[EDITED 2] And if you want to compare the leading character(s) only:
R(iB) = sum(strncmp(A, B{iB}, length(B{iB}));
  1 Comment
Vincent I
Vincent I on 10 Jan 2013
sounds goood. Thanks for your answer

Sign in to comment.


Find more on Characters and Strings in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!