2014-11-06 186 views
2

爲了找到向量中每個元素的出現次數,可以在MATLAB中實現的最有效的方法是什麼?在Matlab中計算每個元素的出現次數

例如:

A = { 'AA AB AC CD'; 'BA AC CF GD'; 'AA AB AC CD'; 'CF GD TH EF'; 'AA AB AC CD'} 

我想要得到的是 「AA AB AC CD」 重複3次, 「BA AC CF GD」 重複一次, 「CF GD TH EF」 再一次重複。

我實際上並不關心函數的輸出是2個向量,一個是字符串,另一個是計數,或者其他任何可以完成這個工作的輸出。

我的方法是取每個字符串並計算出現次數,並從初始向量中刪除所有出現次數,以便最壞情況下的運行時間將按n^2的順序排列,其中n是元素的數量在A.

但我需要一個更有效的方法。以C++爲例,我可以使用地圖來使運行時間幾乎是線性的,但可悲的是,Maps並未在MATLAB中實現。

回答

2

我假設A是一個單元陣列 -

A = { 'AA AB AC CD'; 'BA AC CF GD'; 'AA AB AC CD'; 'CF GD TH EF'; 'AA AB AC CD'} 

爲了解決了上述問題,幾種方法都可以在這裏建議。

方法#1

這是一種直接的,沒有搞亂,各地的做法 -

[unique_strings,~,labels] = unique(A,'stable'); 
counts = histc(labels,1:max(labels)) 

方法2

這是一個性能爲導向的解決方案,將單元陣列轉換爲2D陣列 -

[~,idx,labels] = unique(double(char(A)),'rows','stable') 
counts = histc(labels,1:max(labels)) 
unique_strings = A(idx) 

方法3

這是另一種表現取向溶液,與合併的所有字符中的細胞成一個單一的數後的單元陣列轉換爲1D陣列工程 -

num_array = char(A)-0 
pow10_vals = 10.^(size(num_array,2)-1:-1:0) 
[~,idx,labels] = unique(num_array*pow10_vals','stable') %//' 
counts = histc(labels,1:max(labels)) 
unique_strings = A(idx) 

你會得到的輸出 -

>> unique_strings 
unique_strings = 
    'AA AB AC CD' 
    'BA AC CF GD' 
    'CF GD TH EF' 
>> counts 
counts = 
    3 
    1 
    1 

輸出可以在一個奇特的方式顯示以及與table -

>> table(unique_strings,counts) 
ans = 
    unique_strings counts 
    ______________ ______ 
    'AA AB AC CD'  3  
    'BA AC CF GD'  1  
    'CF GD TH EF'  1 

請注意,如果你不關心字符串的順序,你可以跳過'stable'選項與上面提到的方法和可能會更有效一點。

+1

如果你不關心字符串的順序,你可以跳過''stable''選項,這可能會更有效一點。 – Divakar 2014-11-06 17:35:01

+0

這絕對有用,Thx!然而,有關這個功能的複雜性的任何想法?任何想法我怎麼能看看它的代碼? – 2014-11-06 17:42:30

+1

@husseinhammoud通過'看代碼',你的意思是我猜測的一些解釋。所以,這非常簡單 - 「唯一」的第一步是爲我們提供獨特的字符串,並根據每個單元格與其他單元格的共同性爲每個單元格分配一個標籤。在下一步中,我們使用這些標籤併爲每個標籤計數,該標籤對應於上一步中找到的每個唯一字符串/單元格。這是否有點解釋? – Divakar 2014-11-06 17:45:21

相關問題