MATLAB结构体数组赋值

4
我有一个结构体数组,假设为 s(1).value, ... , s(5).value。我有一个数值向量,叫做 vals = [1 2 3 4 5],我想将它赋值给这个结构体数组。所以按照伪代码的写法,我希望能够实现: s(:).value = vals
如下所示,已经有了一种解决方案。但是真的不可能像伪代码中那样用一行代码来完成这个赋值吗?
% Vector of values
vals = [1 2 3 4 5];
n = length(vals);

% Initialize struct
s(n).values = 0;

% Put vals into my struct.values
[s(1:n).values] = ???

% Known solution that i am not satisfied with:
vals_c = num2cell(vals);
[s(1:n).values] = vals_c{:};

最好的问候,乔纳斯


你为什么对你提到的方法不满意?在我看来,它看起来相当整洁。 - erfan
因为对于放入结构体中的每个值向量(例如vals),我需要有一行代码“vals_c = num2cell(vals);”。 - jsjq
你现在用的解决方案可能是最好的。我的方法需要进行结构合并,这可能比这个解决方案更混乱。 - Trogdor
2个回答

1
最近我也经历了同样的阶段,所以我想回答这个问题。
创建一个只有一个字段的新结构:
field = 'f';
value = {'some text';
         [10, 20, 30];
         magic(5)};
s = struct(field,value)

创建一个具有多个字段的非标量结构体:
field1 = 'f1';  value1 = zeros(1,10);
field2 = 'f2';  value2 = {'a', 'b'};
field3 = 'f3';  value3 = {pi, pi.^2};
field4 = 'f4';  value4 = {'fourth'};

s = struct(field1,value1,field2,value2,field3,value3,field4,value4)

此外,正如我一直建议的那样,多次查阅文档是非常必要和有用的,所以请看这里。https://in.mathworks.com/help/matlab/ref/struct.html

谢谢。总结一下,我可以通过以下方式解决我的问题: field1 = 'values'; vals = [1:5]; struct(field1,num2cell(vals)); - jsjq

1

使用cell2struct和num2cell结合起来,可以在一行代码中完成此操作。

% Vector of values
vals = [1 2 3 4 5];
n = length(vals);


% Put vals into my struct.values
s = cell2struct(num2cell(vals), 'values', 1)

% transpose if orientation is important
s  = s.'; 

虽然不太美观,但它可以在一行内完成。 cell2struct 支持多个条目,因此您可能能够填充许多字段。

最大的缺点是它会从头开始创建结构体,因此如果您需要将这些数据添加到现有结构体中,则需要进行结构体合并。


这种方法仅适用于结构的第一个字段。如果s.field1存在且希望将values添加到s,该怎么办? - erfan
正如我所说,这种方法的缺点就是你需要创建第二个结构体并合并它们,或者将它们同时添加到对cell2struct的调用中。 - Trogdor
抱歉,我完全没有看到你回答的最后一行。 - erfan
1
有趣的解决方案,但正如你所提到的,这是否依赖于初始化结构体(以及Abhinav Ralhan的解决方案)。我认为我更喜欢“struct('values',num2cell(vals));”的解决方案。 - jsjq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接