how to get the most repeated element of a cell array?
조회 수: 10 (최근 30일)
이전 댓글 표시
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
Matt J
2013년 4월 26일
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
2013년 4월 26일
In other words, you need to provide a more precise definition of the rule that defines the label.
채택된 답변
Cedric
2013년 4월 26일
편집: Cedric
2013년 4월 26일
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
Cedric
2013년 4월 26일
편집: Cedric
2013년 4월 26일
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
추가 답변 (2개)
the cyclist
2013년 4월 26일
편집: the cyclist
2013년 4월 26일
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.
Peter Saxon
2021년 1월 23일
편집: Peter Saxon
2021년 1월 23일
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
참고 항목
카테고리
Help Center 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!