Вычислить среднее значение полей с одинаковым именем в ячейке структур

У меня есть ячейка, содержащая ряд структур, содержащих выходные данные функции mirToolBox mirfeatures() для ряда аудиосигналов. Имена полей одинаковы для каждой структуры.

Таким образом, данные выглядят примерно так, но гораздо больше. c{1} - первая структура, c{2} - вторая структура и т. д. Обе структуры содержат одинаковые имена полей.

c{1}.field1.field1A=1;
c{1}.field1.field1B=2;
c{1}.field1.field1C=3;
c{1}.field2.field2D.field2E=4;
c{1}.field2.field2D.field2F=5;
c{1}.field3=6;
c{1}.field4.field4A.field4B.field4C=7;
c{1}.field4.field4A.field4B.field4D=8;
c{2}.field1.field1A=9;
c{2}.field1.field1B=10;
c{2}.field1.field1C=11;
c{2}.field2.field2D.field2E=12;
c{2}.field2.field2D.field2F=13;
c{2}.field3=14;
c{2}.field4.field4A.field4B.field4C=15;
c{2}.field4.field4A.field4B.field4D=16;

Я хотел бы рассчитать средние значения каждого поля, по структурам, например

Среднее значение c{1}.field1.field1A, c{2}.field1.field1A,.. c{n}.field1.field1A=9,

Есть ли простой способ сделать это, имея в виду фактические структуры, с которыми я работаю, каждая из которых достигает ста полей?

Спасибо

1 ответ

Решение

Ты можешь использовать cell2mat преобразовать ваш массив ячеек в массив структур, а затем получить доступ к полю всего массива (в отличие от простого элемента структуры из этого массива), чтобы получить список через запятую. Если поле указывает на другую структуру, ваш разделенный запятыми список будет разделенным запятыми списком структур!

Затем вы можете снова собрать этот список через запятую в массив ячеек, окружив его {}и выполняя cell2mat снова и так далее для каждого уровня в вашей структуре, чтобы получить структурные массивы того же размера, что и исходный массив ячеек, содержащий только те поля, которые вам нужны.

Когда вы, наконец, прошли достаточно уровней вниз, чтобы достичь интересующей вас области, вы можете собрать ее снова в виде списка через запятую и обернуть вокруг [] чтобы превратить его в матрицу, которую вы можете использовать в качестве аргумента вашей функции (например, среднее значение).

К сожалению, вам придется делать это для каждого уникального внутреннего поля, которое у вас есть, потому что между ними нет согласованности. Но это позволяет вам обрабатывать все N ячеек за одну операцию для каждого уникального поля.

например, с учетом указанной выше ячейки размера 2, и если мы обозначим s0, s1, s2 как наиболее удаленные, один уровень глубиной, два уровня глубиной и т. д., то:

% Convert outer cell array to struct array representing outermost level
s0 = cell2mat(c); % -> 1x2 struct array containing the fields: field1, field2, field3, field4

% field 1 - subfields of interest are 1 level deep
s1 = cell2mat({s0.field1}); % -> 1x2 struct array containing the fields: field1A, field1B, field1C
field1A_mean = mean([s1.field1A])
field1B_mean = mean([s1.field1B])
field1C_mean = mean([s1.field1C])

% field 2 - subfields of interest are 2 levels deep
s1 = cell2mat({s0.field2}); % -> 1x2 struct array containing the field: field2D
s2 = cell2mat({s1.field2D}); % -> 1x2 struct array containing the fields: field2E, field2F 
field2E_mean = mean([s2.field2E])
field2F_mean = mean([s2.field2F])

% field 3 - collect at this level
field3_mean = mean([s0.field3])

% field 4 subfields of interest are 3 levels deep
s1 = cell2mat({s0.field4});
s2 = cell2mat({s1.field4A});
s3 = cell2mat({s2.field4B});
field4C_mean = mean([s3.field4C])
field4D_mean = mean([s3.field4D])
Другие вопросы по тегам