MATLAB向量化:从向量元素填充结构体字段

4

我有一个结构体向量,每个结构体都有一个字段 x

s1.x = 1;
s2.x = 2;
s3.x = 3;
S = [s1, s2, s3];

我想将给定向量X中的值设置到S中所有结构体的字段x中,也就是说,我想向量化以下循环:

X = [97, 98, 99];
for i = 1 : length(S)
    S(i).x = X(i);
end

这个可以吗?

2个回答

4
你可以这样做:
Xc = num2cell(X); %// convert X to cell array of numbers
[S.x] = Xc{:}; %// generate comma-separated list from cell array, and assign

对于Matlab 7.0之前的版本,第二行应该更改为此内容

[S.x] = deal(Xc{:}); %// generate comma-separated list from cell array, and assign

太好了,搞定了!你能否解释一下为什么这个方法可行而[S.x] = X不行呢?有时候这种向量化的东西对我来说就像巫术一样。 - MGA
1
如果我们正在处理单元数组,您可以省略deal,因此只需这样做:[S.x] = Xc {:}; - rayryeng
2
@MGA:X是一个向量,Xc {:}是一个逗号分隔的列表。只需在中间转换为另一个数据结构即可完成。@Luis Mendo:可以删除deal以获得更短的解决方案。 - Daniel
1
@LuisMendo - 哈哈没问题。不过,对于其他所有事情,您都需要使用deal,但是对于单元数组,您可以省略它。我想这可能会节省一些时钟周期,但是deal肯定更明确! - rayryeng
上面的答案对我没用。这种方式是有效的:Xc = num2cell(X); [S.x(1:length(Xc))] = Xc{:}; - Willem
显示剩余2条评论

0
如果您事先知道值,可以像这样初始化:

S = struct('x', {1 2 3})

1
好的提示,但那不是我想要的。S已经存在,我想一次性从向量X中替换所有的x字段。 - MGA

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