2012-08-02 82 views
3

我有一個100K結構的數組。我列出這樣一個結構的內容如下:在matlab中查找結構數組中出現的次數

迭代:1

塊標識:86

塊標識可在1到100.我想找出塊標識的出現次數之間的值。例如:BlockID「1」發生了25次; BlockID「98」發生58次,依此類推。

我在網上看了看,並試圖在這些鏈接中提到的選項,但不能得到一個解決方案: Matlab: Count number of structs that have a specific content how to count unique elements of a cell in matlab? Matlab: How to calculate how many unique strings are stored in the cell?

回答

1

您可以使用arrayfuncount_unique(count_unique不是正式的功能 - 它來自的MATLAB中心文件交換,可以發現here):

ids= arrayfun(@(x)x.BlockID, struct1); 
[vals, counts] = count_unique(ids); 

NB:正如指出的rody_o(儘管他/她錯過了一個事實,即索引是不必要的)有來串聯,IDS的另一種方式,即

ids = [struct1.BlockID]; 

或者,如果你願意,你可以創建自己的count_unique功能,

function [counts, uns] = count_unique(ids) 
uns= unique(ids); 
counts = arrayfun(@(x)sum(ids == x), uns); 
+0

謝謝,這工作。我正在使用arrayfun,但無法繼續獲取唯一值。我爲你提到的增加了一個額外的步驟。使用cell2mat將「id」轉換爲矩陣,其餘部分是相同的。再次感謝。 – Sarvavyapi 2012-08-02 21:24:36

+0

@Sarvavyapi:太好了,我很高興這解決了你的問題! – jmetz 2012-08-02 21:31:08

+0

@Sarvavyapi:你能再解釋一下爲什麼你需要cell2mat嗎? 'arrayfun'的輸出是一個數組... – jmetz 2012-08-02 21:33:15

1

爲了簡單起見,假設有大小10的BLOCKID一個結構陣列,其值 '1' 之間和 '3':

%generate the struct array 
for n = 1:10 
    structs(n).BlockID = num2str(randi(3)); 
end 
%structs.BlockID : 3  2  1  3  3  2  1  1  2  2 

要找出塊標識的出現次數:

count = accumarray(str2double({structs.BlockID})',1); 
%count : 3  4  3 

現在算(i)是有價值的「我」塊標識的出現次數。

對不起,我英文很差。

1

你可以簡單地用Matlab自己的索引技術,結合histunique

% sample data 

a(1).BlockID = 68 
a(1).iteration = 1 

a(2).BlockID = 88 
a(2).iteration = 12 

a(3).BlockID = 88 
a(3).iteration = 14 

a(4).BlockID = 16 
a(4).iteration = 18 

% collect all BlockID values into array 
b = [a.BlockID]; 

% count unique entries 
[occurrences, entries] = hist(b, unique(b)) 

輸出:

occurrences = 
    1  1  2 
entries = 
    16 68 88 

我一直覺得奇怪的東西的廣泛應用爲[struct(indices).member]符號被少數開發人員知道(或使用)...

+0

提示:連接時不需要索引 - 你提到的符號更簡單:'[a.member]'當然只有通用的特定成員類型;) – jmetz 2012-08-03 17:45:15

+0

真的,我忘了它是一種習慣我的一貫寫結構你*做*需要索引... – 2012-08-03 21:59:12

+0

感謝大家的迴應。我會嘗試這些選項並在此處給出結果。 – Sarvavyapi 2012-08-06 19:41:27