如何在MATLAB中搜索单元数组中的字符串?

108

假设我有一个单元格数组

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}

如果我想查找'KU'的索引,应该怎么做?


8
请注意,当前的最佳答案已经过时。一定要查看这个答案 - Dennis Jaheruddin
8个回答

131

我猜以下代码可以解决问题:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ind=find(ismember(strs,'KU'))
这会返回什么?
ans = 
     2

13
请记住,这个通用解决方案适用于多个数据类型,但只适用于精确匹配。如果您需要不区分大小写的匹配,请参考https://dev59.com/QWsz5IYBdhLWcg3wNE5q#9433112。如果您需要匹配更复杂的内容,例如正则表达式或结构体中的字段,请参考https://dev59.com/QWsz5IYBdhLWcg3wNE5q#8061808。 - rob
1
ismember有点笨重,而且可能会在更新版本中被替换。我觉得使用基于str的函数比较安全,例如strcmpi等。 - Maddy
1
也适用于Octave。 - Nino van Hooff

90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

已经过时间为0.001976秒。

>> tic; find(strcmp('KU', strs)); toc

经过0.000014秒的时间,很明显strcmp('KU', strs)所需时间比ismember(strs,'KU')少得多。


5
太棒了!你的解决方案应该是最优秀的! - Antonvh
1
是的,我同意,这是最好的解决方案,但它只是安德烈和维达解决方案之间的比较。所以实际上应该给安德烈。 - Leo
1
实际上,应该指出,如果您正在比较两个不同大小的数组(即,如果左侧不是“KU”,而是一个字符串数组),则此方法无法工作。 Vidar的解决方案在这种情况下确实有效(非常好),因此更通用。 - Nate
@pankaj:这与制作一个字符串->索引映射,然后通过进行映射查找来获取索引相比如何?就性能而言。 - faizan

41

自2011年以来,推荐的方式是:

booleanIndex = strcmp('KU', strs)

如果你想获取整数索引(通常情况下你并不需要),你可以使用以下代码:

integerIndex = find(booleanIndex);

strfind已经被弃用,请尽量不要使用它。


25

我看到大家都错过了你代码中最重要的缺陷:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}

应该是:

strs = {'HA' 'KU' 'NA' 'MA' 'TATA'} 
或者
strs = {'HAKUNA' 'MATATA'}

现在,如果您坚持使用

ind=find(ismember(strs,'KU'))

你将会无忧无虑 :)


我正要编辑原始问题,但看到了太多的答案 :) - raggot

13

其他答案可能更简单,但为了完整性,我认为应该添加使用带有匿名函数的cellfun的方法。

indices = find(cellfun(@(x) strcmp(x,'KU'), strs))

这种方法的优势在于您可以轻松地将其忽略大小写或在具有单元结构数组的情况下使用:

indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))

6

最短的代码:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
[~,ind]=ismember('KU', strs)

但它只返回strs中的第一个位置。如果未找到元素,则ind=0


5

strcmp和strcmpi函数是最直接的方法。它们通过搜索数组来实现。

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))

-2

你试过了吗?

indices = Find(strs, 'KU')

查看链接

或者,

indices = strfind(strs, 'KU');

如果我没记错的话,这也应该能够工作。


我尝试使用find函数,但由于数组是单元数组,所以MATLAB返回了一些错误... 但是strfind函数似乎可以工作,谢谢! - Benjamin

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