从嵌套的Matlab结构构建Matlab表

时间:2016-01-15 16:03:22

标签: matlab

如何根据以下代码生成的Matlab结构构建表?

%create a nested structure
a_1=struct('a',50,'b',60);
a_2=struct('a',45','c',90);
a_3=struct('c',105,'d',32);
a=struct('Model1',a_1,'Model2',a_2,'Model3',a_3);

所需的输出看起来像下面代码的输出:

%desired output 
a=[50;45;0];
b=[60;0;0];
c=[0;90;105];
d=[0;0;30];
row_names={'Model1','Model2','Model3'};
col_names={'a','b','c','d'};

T=table(a,b,c,d,'RowNames',row_names)

但请注意,我必须填写0 s的空白来编写此代码,但最好还有其他内容,例如'-'N/A

1 个答案:

答案 0 :(得分:2)

不是很好,但是这样的事情可以帮到你。使用fieldnames获取行名称非常简单。

row_names = fieldnames(a);

为了确保所有结果的正确长度,获取表格的所有可能列非常有用。

% Obtain all existing fields to correctly assign all zeros
all_fields = {};

for r = 1:length(row_names)    
    act = eval('a.(row_names{r})');

    fields = fieldnames(act);

    all_fields = union(all_fields,fields);
end

然后使用正确的大小将其设置为零。这样可以避免在桌子内部使用时拧紧尺寸。

% Set everything to zero
for f_num = 1:length(all_fields)
    res.(all_fields{f_num}) = zeros(size(row_names));
end

最后,必须遍历所有初始结构并将值添加到相应的结果中。

% Overwrite zeros by existing values
for r = 1:length(row_names)    
    act = eval('a.(row_names{r})');

    fields = fieldnames(act);

    for f = 1:length(fields)
        res.(fields{f})(r) = act.(fields{f});
    end
end

table(res.a,res.b,res.c,res.d,'RowNames',row_names)

我已使用struct作为结果,以避免更多的逃避。