我有两个关于在MATLAB中搜索字符串的问题
如果我必须在字符串的单元格数组中找到一个字符串,我可以执行以下操作以获取单元格数组中'PO'
的位置
find(strcmpi({'PO','FOO','PO1','FOO1','PO1','PO'},'PO'))
% 1 6
但是,我真的想同时搜索多个字符串({'PO1', 'PO'}
)(不使用for循环)。最好的方法是什么?
是否有像histc()
这样的函数可以告诉我字符串发生了多少次。对于一个字符串,我可以这样做:
length(strfind({'PO','FOO','PO1','FOO1','PO1','PO'},'PO'))
但这显然不适用于多个字符串。
答案 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]