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


Answers:


128

我猜下面的代码可以达到目的:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ind=find(ismember(strs,'KU'))

这返回

ans = 
     2

11
请记住,这种通用解决方案很好,因为它适用于多种数据类型,但仅适用于完全匹配。如果您需要不区分大小写的匹配,请参阅stackoverflow.com/a/9433112/44737。如果您需要匹配更复杂的东西(例如正则表达式或结构中的字段),请参见stackoverflow.com/a/8061808/44737
rob

ismember有点笨拙,可以使用较新的版本进行更新。我觉得像strcmpi等更安全与海峡基于功能
马迪

1
也在八度工作
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
大!您的解决方案应该是最重要的!
2014年

1
是的,我同意,这是最好的解决方案,但是它只是Andreys和Vidars解决方案之间的比较。所以实际上安德烈应该得到它。
狮子座

1
实际上,应该指出的是,如果要比较两个大小不同的数组(例如,如果不是左侧的“ KU”,而是具有字符串数组),则此方法不起作用。在这种情况下,Vidar的解决方案确实可以工作(相当不错),因此更为通用。
Nate

@pankaj:与制作String-> Indices的地图,然后通过进行地图查找来获取索引相比,这有何不同?明智地询问。
faizan

39

从2011a开始,推荐的方法是:

booleanIndex = strcmp('KU', strs)

如果要获取整数索引(通常不需要),可以使用:

integerIndex = find(booleanIndex);

strfind 已弃用,因此请不要使用它。


23

我发现每个人都错过了代码中最重要的缺陷:

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))


5

strcmp和strcmpi函数是执行此操作的最直接方法。他们搜索数组。

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

-2

你试过了吗

indices = Find(strs, 'KU')

看到 链接

或者,

indices = strfind(strs, 'KU');

如果我没记错的话,它也应该工作。


我试过查找,但是由于数组是单元数组,因此MATLAB向我返回了一些错误...但是函数strfind似乎可以正常工作,谢谢!
本杰明
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.