2014-09-02 32 views
2

我需要的功能(即mean)適用於結構數組的各個領域。即,如果我有以下結構數組:應用的功能,結構數組的各個領域在Matlab

A(1).x = 1; 
A(1).y = 2; 
A(2).x = 3; 
A(2).y = 4; 

我想找到x值的均值和y值的均值。該解決方案應該適用於結構中的任意數量的字段。

我最初的想法是使用structfun,但現在我只能和轉換結構的數組到數組結構的問題。我想我可以使用循環遍歷fieldnames返回的字段名稱,但也許有一個更直接的方法。

+0

如果你想創建陣列的結構,然後使用''用於計算mean' structfun',試試這個[解決方案](http://stackoverflow.com/a/25631349/3293881) – Divakar 2014-09-02 19:58:24

回答

2

最簡單的解決方案,我知道

F=fieldnames(A) 
G=struct() 
for ix=1:numel(F) 
    G.(F{ix})=mean([A.(F{ix})]); 
end 

我碰到另一個想法來解決這個問題:

cell2struct(cellfun(@(x)(mean([A.(x)])),fieldnames(A),'uni',false),fieldnames(A),1) 

如果一個矢量,而不是一個結構是預期的輸出,去掉外cell2struct

3

如果內容是標量:從結構體轉化爲細胞,然後從細胞到基質:

mean(cell2mat(squeeze(struct2cell(A))), 2) 
2

方法#1

如果您正在尋找創建數組結構,然後用structfun執行mean,你可以試試這個無環路的方法 -

%// Get fieldnames 
fns = fieldnames(A) 

%// Get numeric values from the fields and store as numeric array 
arrayvals = reshape(struct2array(A),numel(fns),[]) 

%// Convert to cell array so that struct of arrays could be obtained 
data = mat2cell(arrayvals,ones(1,numel(fns)),size(arrayvals,2)) 

%// Convert to struct of arrays as you were looking to work with 
A1 = cell2struct(data, fns, 1) 

%// Finally the mean values with structfun 
meanvals = structfun(@mean, A1) 

輸出(顯示A和A1) -

A = 
1x2 struct array with fields: 
    x 
    y 
A1 = 
    x: [1 3] 
    y: [2 4] 

方法2

如果你想跳進mean結果,而與structfun被打擾,您可以將您的結構直接轉換爲數字陣列,並得到平均值這種方式 -

meanvals = mean(reshape(struct2array(A),numel(fieldnames(A)),[]),2)