Joa*_*him 5 arrays matlab structure
假设我有两个具有匹配字段的结构数组,并且给定字段中两个数组的内容大小相同:
A.field1 = [1,2,3]
A.field2 = 5
B.field1 = [4,5,6]
B.field2 = 9
Run Code Online (Sandbox Code Playgroud)
我想对每个字段中的所有数据进行线性组合.在我们的例子中,这意味着如果x和y是常量,我想得到一个结构数组C.
C.field1 = x*(A.field1) + y*(B.field1)
C.field2 = x*(A.field2) + y*(B.field2)
Run Code Online (Sandbox Code Playgroud)
我的第一个猜测是使用命令structfun,但这似乎只是将一个结构数组作为输入,其中我需要输入A和B.
一种直接的方法是提取所有数据并将它们存储在单独的变量中,采用线性组合,并将它们放回到结构数组中.但似乎必须有一个更简单的方法(或者至少有一个更快的类型,我的数组不是那么小).
以下假设您有两个具有任意数量的匹配字段的结构体数组(n
-两个结构体相同),它们不是嵌套的(否A.field1.field2
)
香草循环:
x = 2;
y = 3;
names = fieldnames(A); % returns n x 1 cell array
for n = 1:length(names)
C.(names{n}) = x*A.(names{n}) + y*B.(names{n});
end
Run Code Online (Sandbox Code Playgroud)
输出:
C =
field1: [14 19 24]
field2: 37
Run Code Online (Sandbox Code Playgroud)
使用 cellfun 的替代方案:
x = 2;
y = 3;
names = fieldnames(A);
A2 = struct2cell(A);
B2 = struct2cell(B);
C2 = cellfun(@(A,B) x*A+3*B, A2,B2,'UniformOutput',0);
C2 = cell2struct(C2,names)
Run Code Online (Sandbox Code Playgroud)
输出:
C2 =
field1: [14 19 24]
field2: 37
Run Code Online (Sandbox Code Playgroud)