2012-10-23 63 views
2

我一直在搜索Google搜索,但尚未取得成功。我想知道a{1}a{2}每個考慮所有領域的最大值。同樣,我想知道每個a的意思,也考慮所有領域。查找結構陣列的最大數

a{1}.field1=[1:5]; 
a{2}.field1=[1:6]; 
a{1}.field2=[2:8]; 
a{2}.field2=[2:9]; 

我希望在一個循環之下的東西會工作:

fn=fieldnames(a{1}); 
max(a{1}.(fn{:})) 
mean(a{1}.(fn{:})) 

我認爲有一些超級有效的方式做到這一點,我很想念......有什麼建議? 感謝

回答

4

假設在你的結構數據中每個字段是與最大/平均值功能兼容,你可以使用:

maxima(ii) = max(structfun(@max, a{ii}))
means(ii) = mean(structfun(@mean, a{ii}))

Structfun返回每個字段的最大/平均值中的列向量。最大和平均函數可以很容易地再次應用來找到總的最大/平均值。然後你可以在一個循環中運行這個結構數組。

+0

謝謝。這很好,很簡單。嵌套cellfun解決方案會更快嗎? – Dominik

4

首先,我想你的意思是定義一個多維結構:

a(1).field1=[1:5]; 
a(2).field1=[1:6]; 
a(1).field2=[2:8]; 
a(2).field2=[2:9]; 

(注圓括號而不是花括號大括號會給你包含兩個單元陣列struct s)。現在,值,您尋找:

max_mean = cellfun(@(x)[max(x) mean(x)], {a.field1}, 'UniformOutput', false); 

這樣做,會給你maximim和max_mean{1}a(1).field1平均,最大和max_mean{2}a(2).field1意思。

這樣做的所有字段可以由另一個cellfun嵌套cellfun以上來完成:

max_means = cellfun(@(x) ... 
    cellfun(@(y)[max(y) mean(y)], {a.(x)}, 'UniformOutput', false), ... 
    fieldnames(a), 'UniformOutput', false); 

使

max_means{1}{1} % will give you the max's and means of a(1).field1 
max_means{1}{2} % will give you the max's and means of a(2).field1 
max_means{2}{1} % will give you the max's and means of a(1).field2 
max_means{2}{2} % will give you the max's and means of a(2).field2 

發揮這些功能,直到您找到適合您的需求。

+0

Rody,max_means個別向量包含一個字段向量的最大值和平均值,即max_means {1} {1}不包含最大值,而是包含最大值和最大值,意思是來自'a(1).field1'。 – angainor

+0

@angainor:的確,謝謝!編輯。 –

+0

感謝您的回答!你是對的,我有多維結構。什麼時候使用結構數組和多維結構有什麼意義? – Dominik