如何获取这些数组并使用它们填充结构的字段



我有几个向量,希望用它们来填充结构数组中的字段。向量将只具有两个长度中的一个——要么长度为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

这种方法的优点是代码更易于阅读。

相关内容

  • 没有找到相关文章

最新更新