MATLAB - > struct.field(1:结束)点域?

时间:2012-03-15 07:36:23

标签: matlab

有没有办法在一行中获得子字段的所有结构子字段值?像这样:

struct.field(1:end).field 

2 个答案:

答案 0 :(得分:1)

简单结构示例

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棘手的匿名函数通常会提供所需的索引技术:

dStruct.subField = struct('subSubField', {[1;2];'myString'});
valueLeafs_d     = arrayfun(@(x) x.subSubField, dStruct.subField, 'UniformOutput', false)

答案 1 :(得分:0)

如果我理解你的问题,你想要将名为'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]