如何根据以下代码生成的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
。
答案 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
作为结果,以避免更多的逃避。