2015-10-22 2 views
0

У меня есть структура в следующем формате:Mean полей в структуре с использованием structfun, Matlab

A.L1.data = <1000x3 double> 
A.L2.data = <1000x3 double> 
A.L3.data = <1000x3 double> 

Я хотел бы получить среднее значение первого столбца всех полей, т.е. один вектор 1000 строки, которые являются средними для L1, L2 и L3.

Я попытался с помощью structfun со следующим кодом:

foo = structfun(@(x) mean(x.data(:,1)), A, 'UniformOutput', false) 

Однако, это дает мне среднее (одно значение) каждого первого столбца, а не среднее значение всех полей.

Если я:

foo = structfun(@(x) mean(x.data), A, 'UniformOutput', false) 

я получить среднее значение каждого столбца для каждого поля.

Как мне изменить свой код?

+0

'x.data (:, 1)' используется для обозначения первого столбца, базового синтаксиса индекса MATLAB. Вместо этого попробуйте 'mean (x.data)'. – Adriaan

ответ

1

Вы можете получить доступ ко всем данным структуры на struct2array.

Get структура firstColumnsOfData с полями L1L2L3 с первыми столбцами data:

firstColumnsOfData = structfun(@(x) x.data(:,1), A, 'UniformOutput', false) 

Получить среднее из каждого элемента L1L2L3:

mL123 = mean(struct2array(firstColumnsOfData')) % transpose to not get mean of each field 
1

Я понимаю ваш вопрос означает, что вам нужно среднее значение A.L1.data(ii,1), A.L2.data(ii,1) и A.L3.data(ii,1), тем самым создавая вектор столбца с 1000 элементами. С structfun я не вижу, как вы можете применить его к полям в структуре, поскольку это применит функцию, предоставляемую каждому полю в структуре последовательно.

Я думаю, что вы хотите это:

bar = mean([A.L1.data(:,1) A.L2.data(:,1) A.L3.data(:,1)], 2); 

Передача 2 в качестве второго аргумента для обозначения обеспечивает среднее по рядам в противоположность вниз колонны.

+0

У меня недостаточно очков для комментариев по решению @ JaBe, но следует отметить, что 'struct2array' не существует в R2015b. Кроме того, в более ранней версии Matlab было бы лучше использовать второй аргумент для обозначения, чем перенос набора данных. Следующие работы: 'mean (cell2mat (struct2cell (firstColumnsOfData) '), 2);' – houtanb

+0

Я запускаю Matlab R2015b на OSX, и 'struct2array' действительно существует. –

+0

А, это в панели инструментов обработки сигналов. Мое решение не требует инструментария. – houtanb

Смежные вопросы