在字符串的单元格数组中查找多个字符串的位置

时间:2016-06-14 15:47:25

标签: string matlab

我有两个关于在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'))
    

    但这显然不适用于多个字符串。

1 个答案:

答案 0 :(得分:2)

如果你想找到多个字符串,那么只需使用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]
相关问题