MATLAB -> struct.field (1: end) .field? - PullRequest
1 голос
/ 15 марта 2012

Есть ли способ получить все значения подполя структуры подполя в одной строке? Примерно так:

struct.field(1:end).field 

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Пример простой структуры

aStruct.subField = struct('subSubField', {1;2;3;4})

Так что

aStruct.subField(1).subSubField == 1
aStruct.subField(1).subSubField == 2

И т. Д.Тогда значения конечных узлов можно получить через однострочник как

valueLeafs = [aStruct.subField.subSubField];

, который можно проверить с помощью assert(all(valueLeafs == [1,2,3,4])).

Пример нескалярной структуры

Вышеупомянутая однострочная строка также работает, когда значения конечных узлов не являются скалярными, так что их можно объединять в горизонтальном направлении.Например,

bStruct.subField = struct('subSubField', {[1,2];[3,4]})
valueLeafs_b     = [bStruct.subField.subSubField]; % works okay
cStruct.subField = struct('subSubField', {[1,2];[3;4]})
valueLeafs_c     = [cStruct.subField.subSubField]; % error: bad arg dims

Пример структуры отдельного класса

Приведенное ранее однострочное решение не работает, если значения конечных узлов различаются по классам, поскольку они не могут - как правило, объединяться.Однако использование анонимной функции arrayfun и tricky обычно обеспечивает необходимую технику индексирования:

dStruct.subField = struct('subSubField', {[1;2];'myString'});
valueLeafs_d     = arrayfun(@(x) x.subSubField, dStruct.subField, 'UniformOutput', false)
1 голос
/ 15 марта 2012

Если я правильно понимаю ваш вопрос, вы хотите собрать все поля структуры второго уровня с именем 'field' в один выходной массив. Он не совсем соответствует вашему запросу на однострочник, но вы можете сделать это так:

a.field1.a = 1;
a.field1.b = 2;
a.field2.a = 3;
a.field2.b = 4;

result = [];
for x = fieldnames(a)'
     result = horzcat(result, a.(x{:}).a);
end

Конечное значение result равно [1 3]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...