Matlab 当两个结构具有相同的字段时,如何逐元素添加、减去等

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

我有各种各样的结构,其中有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
        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