Matlab 当两个结构具有相同的字段时,如何逐元素添加、减去等
我有各种各样的结构,其中有W、p、E字段,其中包含数值。我想开发一种干净的方法来添加和减去这些结构,而无需每次在子函数中解包和重新打包(到目前为止,这是我的解决方案) 例如,假设:Matlab 当两个结构具有相同的字段时,如何逐元素添加、减去等,matlab,class,oop,struct,Matlab,Class,Oop,Struct,我有各种各样的结构,其中有W、p、E字段,其中包含数值。我想开发一种干净的方法来添加和减去这些结构,而无需每次在子函数中解包和重新打包(到目前为止,这是我的解决方案) 例如,假设: S.W = 2 S.P = 3 S.E = 4 M.W = 20 M.P = 30 M.E = 40 我希望能够做到X=S+M,并最终得到: X.W = 22 X.P = 33 X.E = 44 我当前的尝试是通过一个新类实现的,它如下所示: classdef CV properties
S.W = 2
S.P = 3
S.E = 4
M.W = 20
M.P = 30
M.E = 40
我希望能够做到X=S+M
,并最终得到:
X.W = 22
X.P = 33
X.E = 44
我当前的尝试是通过一个新类实现的,它如下所示:
classdef CV
properties
W
P
E
end
methods
function r = plus(o1,o2)
r = CV;
r.E = o1.E + o2.E;
r.P = o1.P + o2.P;
r.W = o1.W + o2.W;
end
end
end
这允许进行S+M运算,并以与输入相同的形式返回一个新变量。我通常不熟悉课程,想知道这是否是正确的形式。如果是这样,我可能会继续在
方法
部分添加减号
和时间
的函数。然而,这似乎需要大量重复的代码,我觉得必须有一个更简单的解决方案。非常感谢您的建议。以下代码直接在结构上工作,而无需将结构嵌套在类中。假设两个输入结构具有相同的字段名(在本例中为W、P和E),但是,它们的顺序可能是任意的(您在注释中提到这对应用程序很重要)
如此定义
S.W = 2
S.P = 3
S.E = 4
M.E = 40
M.P = 30
M.W = 20
(注意M的相反顺序)和调用
X = structplus(S, M)
生成一个结构,其字段名的顺序与第一个参数相同:
X =
struct with fields:
W: 22
P: 33
E: 44
要扩展Le Phlaux的答案,您可以为所需的二进制运算符(例如,
@plus
,@减号
)提供函数句柄,并递归地处理子结构
function out = structBinaryFunc(in1, in2, func)
fn = fieldnames(in1);
for ii = 1:numel(fn)
if isstruct(in1.(fn{ii}))
out.(fn{ii}) = structBinaryFunc(in1.(fn{ii}), in2.(fn{ii}), func)
else
out.(fn{ii}) = func(in1.(fn{ii}), in2.(fn{ii}));
end
end
例如,您可以调用
X=structBinaryFunc(S,M,@plus)
您可以通过struct2array
将struct转换为数组,进行计算,然后根据struct的每个字段的维度将结果分配到struct。这是一个很好的计划,但我担心无法检查所有struct是否具有相同的顺序(也就是说,由于它们都是在代码中的不同位置定义的,我不想担心它们都是按W,P,e的顺序定义的,如果这有意义的话,那是一个很好的优雅的解决方案。你知道没有循环的方法吗?我发现如果我使用cellfun而不是循环,我无法获得结构output@teepee所以,cell2结构(cellfun(@(n)M.(n)+S.(n),fn,'UniformOutput',false),fn,1)
?但是cellfun
与for
循环差不多相同cellfun
在几乎所有非平凡的情况下都比显式循环慢
function out = structBinaryFunc(in1, in2, func)
fn = fieldnames(in1);
for ii = 1:numel(fn)
if isstruct(in1.(fn{ii}))
out.(fn{ii}) = structBinaryFunc(in1.(fn{ii}), in2.(fn{ii}), func)
else
out.(fn{ii}) = func(in1.(fn{ii}), in2.(fn{ii}));
end
end