假设有两个结构体 main_subject
和 all_subject
。其中 main_subject
中包含了某位同学的主修成绩和学号姓名信息,需要将这些信息地填到包含所有科目信息的另一个结构体 all_subject
对应的字段中(不存在的字段保持默认值),如何比较便利地实现呢?
all_subject =
包含以下字段的 struct:
Name: ''
ID: 0
Chinese: 0
Math: 0
English: 0
Physics: 0
History: 0
main_subject =
包含以下字段的 struct:
Name: 'Jake'
ID: 101
Chinese: 102
Math: 150
English: 122
具体的实现如下:
main_subject = struct('Name', 'Jake',...
'ID', 101, ...
'Chinese', 102,...
'Math', 150,...
'English', 122)
all_subject = struct('Name', '', ...
'ID', 0, ...
'Chinese', 0, ...
'Math', 0, ...
'English', 0, ...
'Physics', 0, ...
'History', 0)
cmb = structAssign(all_subject, main_subject)
function [structA] = structAssign(structA, structB)
% 将 structB 中与 structA 相同字段的成员的值赋值给 structA 对应的成员
keys = fieldnames(structB); % 获得结构体B的所有字段
for i = 1:length(keys)
cur_key = keys{i};
if isfield(structA, cur_key)
% 2017年后支持: structName.(dynamicExpression)
% dynamicExpression 是一个变量或表达式,返回字符串标量(结构体字段)
% 类似于 getfield() 和 setfield() 功能
structA.(cur_key) = structB.(cur_key);
else
warming('字段"%s"不存在!', cur_key);
end
end
end
说明:
-
不能直接赋值
all_subject = main_subject
。直接赋值的结果是all_subject
完全复制main_subject
,丢失了原来的部分字段。 -
关于 Matlab 结构体常用的几个操作函数:
- struct 创建结构体
- fieldnames 返回结构体的所有字段名称
- getfield 返回指定字段的值
- isfield 确定输入是否为结构体数组字段
- isstruct 确定输入是否为结构体数组
- orderfields 对结构体数组的字段进行排序
- rmfield 删除结构体中的字段
- setfield 为结构体数组字段赋值
- arrayfun 将函数应用于每个数组元素
- structfun 对标量结构体的每个字段应用函数
- table2struct 将表转换为结构体数组
- struct2table 将结构体数组转换为表
- cell2struct 将元胞数组转换为结构体数组
- struct2cell 将结构体转换为元胞数组
-
Generate Field Names from Variables Matlab2017版本之后,结构体可以基于变量的字段访问方式,常见的字段访问有
% 方式1 main_subject.Chinese = 123; chinese = main_subject.Chinese; % 方式2 main_subject.('Chinese') = 123; chinese = main_subject.('Chinese'); % 方式3 main_subject = setfield(main_subject, 'Chinese', 123); chinese = getfield(main_subject, 'Chinese');