# How to find the number of different strings in a cell array?

312 views (last 30 days)
Faranak on 3 Oct 2017
Edited: Cedric Wannaz on 3 Oct 2017
Hi, I have a cell with different strings. I don't know what are those strings and how many times they are repeated. I want to find the names of strings and find how many they are repeated. For example: c={'a' 'a' 'a' 'a' 'b' 'b' 'b' 'c' 'c' 'd' 'e'}; I want the answer to say that strings are a,b,c,d,e and the numbers they are repeating are 4,3,2,1,1.
I tried strfind command but it is good for a time that you know what are the strings (which I don't know what are the strings!). I tried strcmp command to find how many each are repeated. But still I have problem with finding the strings! Can anyone help me?
Thanks

Cedric Wannaz on 3 Oct 2017
Edited: Cedric Wannaz on 3 Oct 2017
Use
uc = unique(c) ;
to get a cell array of unique strings, and its length is their count.
If you need a stat of repetition, use the 2nd or 3rd output of UNIQUE and accumulate ones using it as IDs in acall to ACCUMARRAY.
I can't test right now, but something like
[uc, ~, idc] = unique( c ) ;
counts = accumarray( idc, ones(size(idc)) ) ;
##### 2 CommentsShowHide 1 older comment
Cedric Wannaz on 3 Oct 2017
Edited: Cedric Wannaz on 3 Oct 2017
My pleasure! Look at Walter's answer and ImageAnalyst example; FINDGROUPS and HISTCOUNTS may be simpler to (re-)understand if you look back at your code in a few years.

Walter Roberson on 3 Oct 2017
For R2015b or later, use findgroups()
Image Analyst on 3 Oct 2017
E.g.
c={'a' 'a' 'a' 'a' 'b' 'b' 'b' 'c' 'c' 'd' 'e' 'a' 'a' };
[d, id] = findgroups(c)
counts = histcounts(d)
d =
1 1 1 1 2 2 2 3 3 4 5 1 1
id =
1×5 cell array
{'a'} {'b'} {'c'} {'d'} {'e'}
counts =
6 3 2 1 1