2016-06-14 61 views
1

的单元阵列的位置,我有一个关于在MATLAB查找多个字符串的字符串

  1. 搜索字符串2的问题,如果我必须找到字符串我可以做以下的单元阵列中的串得到的'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')) 
    

    但是,这显然不适用于多个字符串在一次。

回答

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] 
+0

三江源这么多的帮助,你的回复总是很棒,非常有帮助! ismember()是我的第一个方法,但我很困惑如何使用索引实际上,但现在我已经意识到 – Umar

+0

accumarray工作像一个魅力,再次感谢 – Umar