我想将结构中的多个字段设置为单个值。这些领域可能是新的。字段名称可能是动态定义的。字段名称的数量是动态定义的。有没有好办法呢?
例如,如果字段名称的数量是固定的,则以下情况有效。但这很乏味而且很愚蠢。如果允许更改字段名称的数量,它将不起作用。
S=struct;
[S.f1,S.f2,S.f3]=deal(input);
答案 0 :(得分:2)
我现在能想到的最简单的事情是:
function [myStruct] = InitStruct(myStruct, initValue)
%[
% Default arguments for demo purpose
if (nargin < 2), initValue = 42; end
if (nargin < 1), myStruct = struct('f1', '', 'f2', '', 'f3', ''); end
% Obtain all current fields in the structure
fnames = fieldnames(myStruct);
% Dynamically set all fields with initValue
for fi = 1:length(fnames),
myStruct.(fnames{fi}) = initValue;
end
%]
end
注意:它只适用于结构是标量的...包含所有情况,你可以在结构的长度上添加一个循环:
function [myStruct] = InitStruct(myStruct, initValue)
%[
if (nargin < 2), initValue = 42; end
if (nargin < 1),
myStruct = struct('f1', '', 'f2', '', 'f3', '');
myStruct = repmat(myStruct, [2 6]); % Making structure not scalar
end
fnames = fieldnames(myStruct);
for fi = 1:length(fnames),
for linearIndex = 1:length(myStruct),
myStruct(linearIndex).(fnames{fi}) = initValue;
end
end
%]
end
答案 1 :(得分:2)
对于字母对(例如f1
,f2
等),我建议使用struct-arrays进行初始化。您可以通过将单元格数组传递给您想要的值的struct
函数来创建它们:
ini = 1;
n = 5;
s = struct('f',repmat({ini},n,1));
然后s
是一个初始值为ini
的结构数组。您可以访问s(1).f
.... s(n).f
等元素。
您还可以将deal
函数与struct array literal一起使用,我觉得它更干净,就像这样;
ini = 1;
n = 5;
s(n).f = [];
[s.f] = deal(ini);
对于更通用的字段名,@ CitizenInsane使用动态字段引用的答案是我所知道的唯一方法。
如果MATLAB使用单元格字符串参数从动态字段创建逗号分隔列表,这可能会改变,但这只是我的梦想。
答案 2 :(得分:0)
这个怎么样?
S = struct('f1', 1, 'f2', 2);
old_fields = fieldnames(S);
old_values = struct2cell(S);
new_fields = {'f2'; 'f3'; 'f4'}; % 1 replacement, 2 new fields
n_new_fields = numel(new_fields);
value = 0;
all_fields = [old_fields ; new_fields];
all_values = [old_values ; repmat({value}, n_new_fields, 1)];
S = cell2struct(all_values, all_fields);
我不确定Matlab是否因为两次相同的字段而无法返回错误(现在无法进行测试)。如果是这样,您需要使用
[all_fields, idx] = unique(all_fields);
all_values = all_values(idx);
在调用cell2struct之前(因为Matlab在最近的版本中改变了unique的行为,所以要小心)。