如何有效地采用两个不同结构阵列的线性组合?

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.

一种直接的方法是提取所有数据并将它们存储在单独的变量中,采用线性组合,并将它们放回到结构数组中.但似乎必须有一个更简单的方法(或者至少有一个更快的类型,我的数组不是那么小).

nkj*_*kjt 1

以下假设您有两个具有任意数量的匹配字段的结构体数组(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)