MATLAB Answers

0

How to find the mode of a string array (no longer works in 2018b)

Anil Kamath さんによって質問されました 2018 年 11 月 16 日
最新アクティビティ Anil Kamath さんによって コメントされました 2018 年 11 月 19 日
I have discovered that the following code worked in Matlab 2018a but now throws an error in 2018b:
mode(["A","A","B"],2)
It would appear that the new version of matlab only allows computing the mode on numeric arrays. Is this a bug, or a known change to how this function works (I know that in this version, some of these functions now operate on multiple dimensions now)? And is there a quick workaround? So far I've created the following hack to operate on strings, though I expect it's pretty inefficient:
Y = strings(1,size(X,2));
for n = 1:size(Y,2)
C = categorical(X(:,n));
CC = categories(C);
[~,ind] = max(countcats(C));
if ~isempty(ind)
Y(n)=string(CC(ind));
end
end

  0 件のコメント

サインイン to comment.

製品


リリース

R2018b

2 件の回答

Adam Danz
回答者: Adam Danz
2018 年 11 月 16 日
編集済み: Adam Danz
2018 年 11 月 16 日
 採用された回答

The documentation for both 2018a and 2018b indicate that the first input to mode() "can be a numeric array, categorical array, datetime array, or duration array." One workaround would be to change your string to a categorical vector.
This works in 2018b
mode(categorical( ["A","A","B"]))
ans =
categorical
A
If needed, you could convert back to a string:
string(mode(categorical( ["A","A","B"])))

  1 件のコメント

Anil Kamath 2018 年 11 月 19 日
Thanks!
It's a shame this doesn't work using the native mode function on strings, as it means you can't quickly compute the mode in a 2D array along a single dimension without converting each slice into a categorical array one by one, and computing the mode of each categorical slice. It feels like a very natural interpretation for the mode of a string to be the string which occurs most frequently...

サインイン to comment.


回答者: Philip Borghesani 2018 年 11 月 16 日

Use a character vector instead of a string array:
mode(['A','A','B'],2)
% or
mode('AABBCCC',2)
I belive it was a bug that it worked with strings in R2018a. It has always worked with character vectors and sombody was a bit too helpful adding support for strings which can’t simply be treated as a numeric value.

  1 件のコメント

Anil Kamath 2018 年 11 月 19 日
I'm afraid this won't work in my use-case as it has to work on multi-character strings rather than just scalar chars (I put a simplified example in my initial question). Adam's answer above looks like it works.

サインイン to comment.



Translated by