how to get the most repeated element of a cell array?
    9 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    DuckDuck
 el 26 de Abr. de 2013
  
    
    
    
    
    Editada: Peter Saxon
 el 23 de En. de 2021
            i have an cell array like this
 {[];[];[];[];[];[];[];[];'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';}
is there a way to get the label of this array as rj?
3 comentarios
  Matt J
      
      
 el 26 de Abr. de 2013
				maybe i did ask the question wrong, but if i have more {''} it will give me that name. instead i want {'rj'}. is there a workaround to counting?
Yes, you'll need to clarify the question. Why should {''} be ignored? Are there any other strings that should be ignored?
  the cyclist
      
      
 el 26 de Abr. de 2013
				In other words, you need to provide a more precise definition of the rule that defines the label.
Respuesta aceptada
  Cedric
      
      
 el 26 de Abr. de 2013
        
      Editada: Cedric
      
      
 el 26 de Abr. de 2013
  
      the cyclist >> I knew I had overlooked something easier. :-)
Well, look at how I did overlook something easier ;-D :
 C = {[];[];[];[];[];[];[];[];'rj';'rj';'rj';'ab';'ab'} ;
 setMatch  = @(s,c) struct('string', s, 'count', c) ;
 match     = setMatch('', 0) ;
 hashtable = java.util.Hashtable() ;
 for k = 1 : length(C)
     if isempty(C{k}), continue ;  end
     if hashtable.containsKey(C{k})
         count = hashtable.get(C{k}) ;
         if count >= match.count,  match = setMatch(C{k}, count+1) ;  end
         hashtable.put(C{k}, count+1) ; 
     else
         if match.count == 0,  match = setMatch(C{k}, 1) ;  end
         hashtable.put(C{k}, 1) ; 
     end
 end
Running this leads to;
 >> match
 match = 
    string: 'rj'
     count: 3
5 comentarios
  Cedric
      
      
 el 26 de Abr. de 2013
				
      Editada: Cedric
      
      
 el 26 de Abr. de 2013
  
			You don't need to save the content of temporary variables at each iteration of the loop. You just need to save results, and you should have something like (where the ".." have to be adapted to your case):
 maxCountElements = cell(size(..), 1) ;
 for k = 1 : ..
    cellData = ..
    indexToEmpty = cellfun(@isempty,cellData);
    cellData(indexToEmpty) = [];
    uniqueCellData = unique(cellData);
    [uniqueCellData,~,whichCell] = unique(cellData);
    cellCount = hist(whichCell,unique(whichCell));
    [~,indexToMaxCellCount] = max(cellCount);
    maxCountElements{k} = uniqueCellData(indexToMaxCellCount) ;
 end
Más respuestas (2)
  the cyclist
      
      
 el 26 de Abr. de 2013
        
      Editada: the cyclist
      
      
 el 26 de Abr. de 2013
  
      Quite convoluted, but I think this works:
cellData = {[];[];[];[];[];[];[];[];'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';'rj';}
indexToEmpty = cellfun(@isempty,cellData);
cellData(indexToEmpty) = {''};
uniqueCellData = unique(cellData);
[~,whichCell] = ismember(cellData,unique(uniqueCellData))
cellCount = hist(whichCell,unique(whichCell));
[~,indexToMaxCellCount] = max(cellCount);
maxCountElement = uniqueCellData(indexToMaxCellCount)
The essence of the algorithm is using the hist() function to count up the frequency. Unfortunately, that function only works on numeric arrays, so I had to use the ismember() command to map the cell array values to numeric values.
A further complication was the existence of the empty cell elements. I replaced them with empty strings. You'll need to be careful if your original array has empty strings.
3 comentarios
  Matt J
      
      
 el 26 de Abr. de 2013
				No need for ismember,
[uniqueCellData,~,whichCell] = unique(cellData);
  Peter Saxon
 el 23 de En. de 2021
        
      Editada: Peter Saxon
 el 23 de En. de 2021
  
      Found a neat solution with categories, just posting this here so when I forget how to do this and google it again I'll see it...
C = {[];[];[];[];[];[];[];[];'rj';'rj';'rj';'ab';'ab'} ;
catC=categorical(C);
catNames=categories(catC);
[~,ix] = max(countcats(catC));
disp(catName{ix}) % rj
0 comentarios
Ver también
Categorías
				Más información sobre Matrix Indexing en Help Center y File Exchange.
			
	Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




