【问题标题】:Find the location of multiple strings in a cell array of strings在字符串元胞数组中查找多个字符串的位置
【发布时间】:2016-06-14 15:47:24
【问题描述】:

我有 2 个关于在 MATLAB 中搜索字符串的问题

  1. 如果我必须在字符串元胞数组中找到一个字符串,我可以执行以下操作来获取'PO' 在元胞数组中的位置

    find(strcmpi({'PO','FOO','PO1','FOO1','PO1','PO'},'PO'))
    %   1   6
    

    但是,我真的很想同时搜索多个字符串 ({'PO1', 'PO'})(不使用 for 循环)。最好的方法是什么?

  2. 有没有像histc() 这样的函数可以告诉我字符串出现了多少次。对于一个字符串,我可以这样做:

    length(strfind({'PO','FOO','PO1','FOO1','PO1','PO'},'PO'))
    

    但这显然不适用于一次处理多个字符串。

【问题讨论】:

    标签: string matlab


    【解决方案1】:

    如果你想查找多个字符串,那么只需使用ismember 的第二个输出来告诉你它是哪个字符串。如果您确实需要不区分大小写的匹配,我添加了 upper 调用以强制所有输入为大写。如果您认为它已经是大写,则可以省略它。

    data = {'PO','FOO','PO1','FOO1','PO1','PO', 'PO'};
    
    [tf, inds] = ismember(upper(data), {'PO1', 'PO'});
    %   2     0     1     0     1     2     2
    

    然后您可以使用第二个输出来确定在哪里找到了哪个字符串:

    % PO1 Occurrences
    find(inds == 1)
    %   3   5
    
    % PO Occurrences
    find(inds == 2)
    %   1   6   7
    

    如果您想要histc 的等效项,您可以使用accumarray 来执行此操作。我们可以将inds 的所有非零值(即您实际搜索的值)传递给它。

    accumarray(inds(tf).', ones(sum(tf), 1))
    %   2   3
    

    如果您想获取 所有 字符串(不仅仅是您要搜索的字符串)的直方图,您可以执行以下操作:

    [strings, ~, inds] = unique(data, 'stable');
    occurrences = accumarray(inds, ones(size(inds)));
    
    %   'PO'      [3]
    %   'FOO'     [1]
    %   'PO1'     [2]
    %   'FOO1'    [1]
    

    【讨论】:

    • 非常感谢您的帮助,您的回复总是很棒而且很有帮助! ismember() 是我的第一种方法,但我对如何实际使用索引感到困惑,但现在我意识到了
    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多