字符串数组中最常见的元素,MATLAB

8

我有一个字符串数组,例如:

arr = ['hello'; 'world'; 'hello'; 'again'; 'I----'; 'said-'; 'hello'; 'again']

如何提取最常见的字符串,在这个例子中是'hello'?
2个回答

12

第一步,使用单元数组而不是字符串数组:

arr = {'hello', 'world'; 'hello', 'again'; 'I----', 'said-'; 'hello', 'again'};

其次,使用 unique 函数可以获取唯一的字符串(这不能用于字符串数组,这就是为什么我建议使用单元格的原因):

[unique_strings, ~, string_map]=unique(arr);

然后使用 mode 函数查找 string_map 变量中出现最频繁的值:

most_common_string=unique_strings(mode(string_map));

4
不需要使用单元数组,可以使用unique(arr, 'rows') - Eitan T
太好了,谢谢!我很少使用它们,不知道这个函数。 - Hugh Nolan
关于字符串数组和上面的评论,需要注意:在这种情况下,需要重新格式化字符串,使每个字符串成为单独的行,而不是尝试在一行上有两个字符串 - 这只能作为一个单元格使用,否则Matlab会将整行视为单个串联的字符串,即问题中的初始 arr 相当于 ['helloworld','helloagain';,'I----said-';'helloagain'] - Hugh Nolan
问题中的所有字符串都用分号垂直连接。我认为你复制粘贴了arr的错误。 - Eitan T
哦,好奇怪。谢谢。不知道怎么发生的。 - Hugh Nolan
如果用户想要字符串输出而不是包含字符串的1x1单元格数组,则应使用most_common_string=unique_strings{mode(string_map)}; - Wolfie

-1

最好使用单元数组和regexp函数;字符串数组的行为可能不符合您的预期。

arr = {'hello', 'world'; 'hello', 'again'; 'I----', 'said-'; 'hello', 'again'};

如果你使用

hellos = sum(~cellfun('isempty', regexp(arr, 'hello')));

它将返回单元数组arr中的'hello'数量。


2
-1:问题是要找到最频繁的字符串,而不是特定预定的字符串。 - Eitan T
即使你正在寻找特定的字符串,使用 regexp 会有点大材小用。strcmp 可用于识别单元数组中相等的字符串。 - kwatford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接