如何在 MATLAB 的元胞数组中搜索字符串?
Posted
技术标签:
【中文标题】如何在 MATLAB 的元胞数组中搜索字符串?【英文标题】:How to search for a string in cell array in MATLAB? 【发布时间】:2011-12-25 01:41:02 【问题描述】:假设我有元胞数组
strs = 'HA' 'KU' 'LA' 'MA' 'TATA'
如果要查找'KU'
的索引该怎么办?
【问题讨论】:
请注意,当前的最佳答案已经过时了。确保同时检查this answer。 【参考方案1】:我猜下面的代码可以解决问题:
strs = 'HA' 'KU' 'LA' 'MA' 'TATA'
ind=find(ismember(strs,'KU'))
返回
ans =
2
【讨论】:
请记住,这个通用解决方案很好,因为它适用于多种数据类型,但它只适用于完全匹配。如果您需要不区分大小写的匹配,请参阅***.com/a/9433112/44737。如果您需要匹配更复杂的内容,例如正则表达式或结构中的字段,请参阅***.com/a/8061808/44737 ismember 有点笨拙,可以使用更新的版本进行更新。我觉得使用 strcmpi 等基于 str 的函数更安全。 也可以在 Octave 中工作【参考方案2】:最短的代码:
strs = 'HA' 'KU' 'LA' 'MA' 'TATA';
[~,ind]=ismember('KU', strs)
但它只返回strs
中的第一个位置。如果未找到元素,则ind=0
。
【讨论】:
【参考方案3】:我发现每个人都忽略了您代码中最重要的缺陷:
strs = 'HA' 'KU' 'LA' 'MA' 'TATA'
应该是:
strs = 'HA' 'KU' 'NA' 'MA' 'TATA'
或
strs = 'HAKUNA' 'MATATA'
现在如果你坚持使用
ind=find(ismember(strs,'KU'))
您将拥有no worries :)。
【讨论】:
我正要编辑原始问题,但看到太多答案:)【参考方案4】:>> 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')
花费的时间要少得多
【讨论】:
太棒了!您的解决方案应该是最重要的! 是的,我同意,这是最好的解决方案,但它只是 andreys 和 vidars 解决方案之间的比较。所以实际上安德烈应该得到它。 其实应该指出,如果你在比较两个不同大小的数组(即如果你有一个字符串数组而不是左侧的'KU' )。 Vidar 的解决方案在这种情况下确实有效(非常好),所以更通用。 @pankaj :这与制作 String->Indices 地图然后通过地图查找获取索引相比如何?明智地询问性能。【参考方案5】:自 2011a 以来,推荐的方式是:
booleanIndex = strcmp('KU', strs)
如果你想获取整数索引(你经常不需要),你可以使用:
integerIndex = find(booleanIndex);
strfind
已弃用,因此请尽量不要使用它。
【讨论】:
【参考方案6】:strcmp 和 strcmpi 函数是最直接的方法。他们通过数组搜索。
strs = 'HA' 'KU' 'LA' 'MA' 'TATA'
ix = find(strcmp(strs, 'KU'))
【讨论】:
【参考方案7】:对于这种情况,其他答案可能更简单,但为了完整起见,我想我会在匿名函数中添加 cellfun 的使用
indices = find(cellfun(@(x) strcmp(x,'KU'), strs))
它的优点是您可以轻松地使其不区分大小写或在具有结构单元数组的情况下使用它:
indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))
【讨论】:
【参考方案8】:你试过了吗
indices = Find(strs, 'KU')
见link
或者,
indices = strfind(strs, 'KU');
如果我没记错的话应该也可以。
【讨论】:
我试过 find 但由于数组是元胞数组,所以 MATLAB 会返回一些错误...但函数 strfind 似乎工作,谢谢!以上是关于如何在 MATLAB 的元胞数组中搜索字符串?的主要内容,如果未能解决你的问题,请参考以下文章