MATLAB:如何使用字符串定义的名称创建结构字段。
我有一个这样的构造函数:MATLAB:如何使用字符串定义的名称创建结构字段。,matlab,structure,Matlab,Structure,我有一个这样的构造函数: function p = class_name(folder, file_name) xmlfile = fullfile(folder, file_name); xDoc = xmlread(xmlfile); struct = xml2struct(xDoc); %lots of repetitive code end if(isfield(struct.parameters, 'parameter_name
function p = class_name(folder, file_name)
xmlfile = fullfile(folder, file_name);
xDoc = xmlread(xmlfile);
struct = xml2struct(xDoc);
%lots of repetitive code
end
if(isfield(struct.parameters, 'parameter_name'))
p.property_name = struct.parameters.parameter_name.Text;
else
p.property_name = '';
end
它读取XML文件并将其转换为结构。然后使用如下重复代码将结构元素分配给类的属性/字段:
function p = class_name(folder, file_name)
xmlfile = fullfile(folder, file_name);
xDoc = xmlread(xmlfile);
struct = xml2struct(xDoc);
%lots of repetitive code
end
if(isfield(struct.parameters, 'parameter_name'))
p.property_name = struct.parameters.parameter_name.Text;
else
p.property_name = '';
end
我想将其放入一个方法/函数中,给定struct元素的名称(此处为“parameter_name”)和类字段/属性的名称(此处为“property_name”)将前者分配给后者
是否可以为此编写通用函数/方法?谢谢。您可以使用动态字段名实现此函数。这是针对此类情况的实施:
function p = setparam(s, p, param_name, prop_name)
if(isfield(s.parameters, param_name))
param = s.parameters.(param_name);
p.(prop_name) = param.Text;
else
p.(prop_name) = '';
end
end
也可以在旧版本的MATLAB上使用setfield和getfield:
function p = setparam(s, p, param_name, prop_name)
if(isfield(s.parameters, param_name))
param = getfield(s.parameters, param_name);
p = setfield(p, prop_name, getfield(param, 'Text'));
else
p = setfield(p, prop_name, '');
end
end
不要在代码中使用struct作为结构名称-它是一个保留关键字。您可以使用动态字段名实现这样的函数。这是针对此类情况的实施:
function p = setparam(s, p, param_name, prop_name)
if(isfield(s.parameters, param_name))
param = s.parameters.(param_name);
p.(prop_name) = param.Text;
else
p.(prop_name) = '';
end
end
也可以在旧版本的MATLAB上使用setfield和getfield:
function p = setparam(s, p, param_name, prop_name)
if(isfield(s.parameters, param_name))
param = getfield(s.parameters, param_name);
p = setfield(p, prop_name, getfield(param, 'Text'));
else
p = setfield(p, prop_name, '');
end
end
不要在代码中使用struct作为结构名称-它是一个保留关键字。使用动态字段名称:
yourStruct.parameters.('parameter_name')
使用动态字段名:
yourStruct.parameters.('parameter_name')
下面是一个通用函数: 可以用于结构或类对象
function obj_to = set_props(obj_to, obj_from)
% insert properties from obj_from into obj_to.
props_from = fieldnames(obj_from);
props_to = fieldnames(obj_to);
for k = 1 : length(props_to)
if ismember(props_to{k}, props_from)
obj_to.(props_to{k}) = obj_from.(props_to{k});
else
obj_to.(props_to{k}) = '';
end
end
现在,在构造函数中:
function obj = class_name(folder, file_name)
xmlfile = fullfile(folder, file_name);
xDoc = xmlread(xmlfile);
s = xml2struct(xDoc); % do not use word "struct" for variables
set_props(obj, s); % if obj has handle, no need to return it from set_props()
end
下面是一个通用函数: 可以用于结构或类对象
function obj_to = set_props(obj_to, obj_from)
% insert properties from obj_from into obj_to.
props_from = fieldnames(obj_from);
props_to = fieldnames(obj_to);
for k = 1 : length(props_to)
if ismember(props_to{k}, props_from)
obj_to.(props_to{k}) = obj_from.(props_to{k});
else
obj_to.(props_to{k}) = '';
end
end
现在,在构造函数中:
function obj = class_name(folder, file_name)
xmlfile = fullfile(folder, file_name);
xDoc = xmlread(xmlfile);
s = xml2struct(xDoc); % do not use word "struct" for variables
set_props(obj, s); % if obj has handle, no need to return it from set_props()
end
我得到一个警告。将动态字段名与结构一起使用,而不是getfield/setfield。我想这就是尼克的意思。你能修改一下你的代码吗?谢谢。@csetzkorn我已经更新了代码。您使用的是什么MATLAB版本?我没有收到任何警告。无论如何,为什么使用动态字段而不是getfield/setfield的解释是一些性能优势。当然,这在代码中是否重要取决于您是否需要检查。但是去掉警告绝对是使用动态字段的一个很好的理由。将动态字段名与结构一起使用,而不是getfield/setfield。我想这就是尼克的意思。你能修改一下你的代码吗?谢谢。@csetzkorn我已经更新了代码。您使用的是什么MATLAB版本?我没有收到任何警告。无论如何,为什么使用动态字段而不是getfield/setfield的解释是一些性能优势。当然,这在代码中是否重要取决于您是否需要检查。但是消除警告绝对是使用动态字段的一个很好的理由。