2016-06-14 76 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