【问题标题】:How to search for a string in cell array in MATLAB?如何在 MATLAB 的元胞数组中搜索字符串?
【发布时间】:2011-12-25 01:41:02
【问题描述】:

假设我有元胞数组

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

如果要查找'KU'的索引该怎么办?

【问题讨论】:

  • 请注意,当前的最佳答案已经过时了。确保同时检查this answer

标签: string matlab cell-array


【解决方案1】:

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

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

返回

ans = 
     2

【讨论】:

  • 请记住,这个通用解决方案很好,因为它适用于多种数据类型,但它只适用于完全匹配。如果您需要不区分大小写的匹配,请参阅stackoverflow.com/a/9433112/44737。如果您需要匹配更复杂的内容,例如正则表达式或结构中的字段,请参阅stackoverflow.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 似乎工作,谢谢!
          猜你喜欢
          • 2012-03-14
          • 2016-09-05
          • 2011-02-07
          • 1970-01-01
          • 2011-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多