给定一个结构数组,我该如何重命名一个字段?例如,鉴于以下情况,我如何将“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