如何在MATLAB中重命名结构体数组中的字段?

4

给定一个结构体数组,如何重命名其中的一个字段?比如,针对以下结构体,如何将“bar”改为“baz”。

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)

什么是最佳方法,其中“最佳”是性能、清晰度和通用性的平衡?


(仅限MathWorks员工,请参见g560416。) - Matthew Simoneau
3个回答

9

在Matthew提出的这个解决方案的基础上,如果新旧字段名以字符串形式存储,则还可以使用动态字段名

newName = 'baz';
oldName = 'bar';
[a.(newName)] = a.(oldName);
a = rmfield(a,oldName);

4
这里有一种使用列表展开/rmfield的方法来实现它:
[a.baz] = a.bar;
a = rmfield(a,'bar');
disp(a)

第一行最初的写法是 [a(:).baz] = deal(a(:).bar);,但 SCFrench 指出 deal 是不必要的。

4
你不需要在第一行进行交易。你可以直接使用[a.baz]=a.bar; - SCFrench
更好的是!我会修改这个答案。 - Matthew Simoneau

2

以下是使用struct2cell/cell2struct的方法:

f = fieldnames(a);
f{strmatch('bar',f,'exact')} = 'baz';
c = struct2cell(a);
a = cell2struct(c,f);
disp(a)

2
函数 rmfield.m 正是做这件事的。就性能而言,rmfield 非常慢。通常你不需要在结构中重命名字段。 - Mikhail Poda
我没有意识到rmfield是在MATLAB代码中实现的。是的,它正在做非常相似的事情。感谢指引。 - Matthew Simoneau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接