我有几个向量,希望用它们来填充结构数组中的字段。向量将只具有两个长度中的一个——要么长度为N,要么长度为1。例如,如果N=3,我的矢量可能如下所示:
a = [0 5 7]
b = [-2 6 8]
c = 6
d = [11 12 13]
e = 20
我希望结果是
my_structure(1).a = 0
my_structure(2).a = 5
my_structure(3).a = 7
my_structure(1).b = -2
my_structure(2).b = 6
my_structure(3).b = 8
my_structure(1).c = 6
my_structure(2).c = 6
my_structure(3).c = 6
my_structure(1).d = 11
my_structure(2).d = 12
my_structure(3).d = 13
my_structure(1).e = 20
my_structure(2).e = 20
my_structure(3).e = 20
您可以看到,对于最初长度为1的向量,结构数组的每个元素都应该具有相同的值。
有没有一种简洁的方法可以实现这一点,而不必遍历每个元素?它应该是可扩展的,这样我就可以添加更多的向量f,g,h,。。。如果需要。
正如评论中所询问的,我不能简单地使用my_structure.a = [0 5 7]
等,因为我需要能够将my_structure(i)
传递给另一个函数,该函数要求每个字段只包含一个值(而不是数组(。
更新答案
事实证明,你可以利用文档中的这一行:
如果任何值输入是非标量单元格数组,则
s
与该单元格数组具有相同的维度。
所以
N = 3; % Each var has 1 or N elements
a = [0 5 7];
b = [-2 6 8];
c = 6;
% Create an anonymous function to make all vars the correct size CELL (1 or N)
pad = @(x) num2cell( repmat(x, 1, N/numel(x)) );
strct = struct( 'a', pad(a), 'b', pad(b), 'c', pad(c) );
这遵循了与下面原始答案类似的思维模式,但显然要简洁得多。
原始答案
最简单的一种详细的方法是从标量结构开始,并将其转换为结构数组。所以…
N = 3; % Each var has 1 or N elements
a = [0 5 7];
b = [-2 6 8];
c = 6;
% Create an anonymous function to make all vars the correct size (1 or N)
pad = @(x) repmat(x, 1, N/numel(x));
% Create the scalar struct with padding
strctA = struct( 'a', pad(a), 'b', pad(b), 'c', pad(c) );
然后,您可以使用一个循环将其转换为结构数组,该数组与变量名没有关联,因此更容易维护:
f = fieldnames(strctA); % Get the field names, i.e. the original variable names
strctB = struct([]); % Create an output struct. The [] input makes it a struct array
for iFn = 1:numel(f) % Loop over the fields
for n = 1:N % Loop over the array elements
strctB(n).(f{iFn}) = strctA.(f{iFn})(n); % Assign to new structure
end
end
Wolfie的答案非常聪明,但您也可以使用一个更直接的解决方案,使用单个for循环:
N = 3;
a = [0 5 7]
b = [-2 6 8]
c = 6
d = [11 12 13]
e = 20
for i = 1:N
my_structure(i).a = a(min(length(a), i))
my_structure(i).b = b(min(length(b), i))
my_structure(i).c = c(min(length(c), i))
my_structure(i).d = d(min(length(d), i))
my_structure(i).e = e(min(length(e), i))
end
这种方法的优点是代码更易于阅读。