让我们说我有两个具有匹配字段的结构数组,并且给定字段中两个数组的内容大小相同:
A.field1 = [1,2,3]
A.field2 = 5
B.field1 = [4,5,6]
B.field2 = 9
我想对每个字段中的所有数据进行线性组合。在我们的例子中,这意味着如果x和y是常量,我想得到一个结构数组C,这样
C.field1 = x*(A.field1) + y*(B.field1)
C.field2 = x*(A.field2) + y*(B.field2)
我的第一个猜测是使用command structfun,但这似乎只是将一个结构数组作为输入,我需要输入A和B.
一种直接的方法是提取所有数据并将它们存储在单独的变量中,采用线性组合,并将它们放回到结构数组中。但似乎必须有一个更简单的方法(或者至少有一个更快的类型,我的数组不是那么小)。
答案 0 :(得分:1)
<强>代码强>
%%// Input structs
A.field1 = [1,2,3]
A.field2 = 5
A.field3 = [8 9];
B.field1 = [4,5,6]
B.field2 = 9
B.field3 = [11 12];
%%// Scaling factors
scaling_factors = [2; 3]; %%// This is your [x y]
cellA = cellfun(@(x) x*scaling_factors(1),struct2cell(A),'un',0)
cellB = cellfun(@(x) x*scaling_factors(2),struct2cell(B),'un',0)
cellC = cellfun(@plus, cellA, cellB,'uni',0)
C = cell2struct(cellC, fieldnames(A))
答案 1 :(得分: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
输出:
C =
field1: [14 19 24]
field2: 37
替代使用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)
输出:
C2 =
field1: [14 19 24]
field2: 37
答案 2 :(得分:1)
您可以将它们转换为支持多个参数的单元格数组:
result = cell2struct( cellfun(@(x,y){1/4*x+3/4*y}, struct2cell(A),struct2cell(B)), fieldnames(A));
相同的代码,但风格更好(我讨厌单行):
cellA = struct2cell(A);
cellB = struct2cell(B);
cellResult = cellfun(@(x,y){1/4*x+3/4*y},cellA,cellB);
result = cell2struct(cellResult , fieldnames(A));