2014-09-02 4 views
2

Мне нужно применить функцию (а именно mean) ко всем полям массива структур. Т.е., если у меня есть следующий массив структур:Применить функцию ко всем полям массива структур в Matlab

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

Я хочу найти среднее из значений х и среднее значения у. Решение должно работать для любого количества полей в структуре.

Моя первоначальная мысль заключалась в использовании structfun, но теперь я столкнулся с проблемой преобразования массива структур в структуру массивов. Думаю, я могу использовать цикл для итерации по именам полей, возвращаемым fieldnames, но, возможно, есть более простой способ.

+0

Если вы хотите создать структуру массивов, а затем используйте 'structfun' для вычисления' mean', попробуйте это [решение] (http://stackoverflow.com/a/25631349/3293881) – Divakar

ответ

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

Если вы хотите создать на структуру массивов, а затем выполнить mean с structfun, вы можете попробовать это не-рамочный подход -

%// 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) 

Output (показ а и А1) -

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) 
Смежные вопросы