給定一個結構數組,我該如何重命名一個字段?例如,鑑於以下情況,我如何將「bar」改爲「baz」。如何在MATLAB中重命名結構數組中的字段?
clear
a(1).foo = 1;
a(1).bar = 'one';
a(2).foo = 2;
a(2).bar = 'two';
a(3).foo = 3;
a(3).bar = 'three';
disp(a)
什麼是最好的方法,其中「最好」是性能,清晰度和通用性的平衡?
給定一個結構數組,我該如何重命名一個字段?例如,鑑於以下情況,我如何將「bar」改爲「baz」。如何在MATLAB中重命名結構數組中的字段?
clear
a(1).foo = 1;
a(1).bar = 'one';
a(2).foo = 2;
a(2).bar = 'two';
a(3).foo = 3;
a(3).bar = 'three';
disp(a)
什麼是最好的方法,其中「最好」是性能,清晰度和通用性的平衡?
上this solution擴大從馬修,你也可以使用dynamic field names如果新老字段名被存儲爲字符串:
newName = 'baz';
oldName = 'bar';
[a.(newName)] = a.(oldName);
a = rmfield(a,oldName);
這裏是AA的方式與struct2cell/cell2struct做到這一點:
f = fieldnames(a);
f{strmatch('bar',f,'exact')} = 'baz';
c = struct2cell(a);
a = cell2struct(c,f);
disp(a)
功能rmfield.m正是這樣做的。關於性能rmfield是非常緩慢的。通常你不需要在結構中重命名字段。 – Mikhail 2010-04-29 05:30:21
我沒有意識到rmfield是在MATLAB代碼中實現的。是的,它做的事情非常相似。感謝指針。 – 2010-04-29 15:14:14
這裏是一種用列表擴展做/ rmfield
:
[a.baz] = a.bar;
a = rmfield(a,'bar');
disp(a)
第一行最初寫[a(:).baz] = deal(a(:).bar);
,但SCFrench指出deal
是不必要的。
你不需要在第一行處理。你可以使用[a.baz] = a.bar; – SCFrench 2010-04-29 02:11:29
更好!我會修改這個答案。 – 2010-04-29 15:15:22
(MathWorks公司的員工,看到g560416) – 2010-04-29 23:03:55