如何在具有相同字段的情况下逐个元素地添加,减去等两个结构

时间:2017-10-18 20:21:11

标签: 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
    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并以与输入相同的形式返回新变量。我通常不熟悉课程,并想知道这是否是正确的形式。如果是这样,我可以继续在minus部分添加timesmethods的功能。但是,这似乎需要大量重复的代码,我觉得必须有一个更简单的解决方案。任何建议都非常感谢。

2 个答案:

答案 0 :(得分:4)

以下代码直接适用于结构体而不将它们嵌套在类中。假设两个输入结构具有相同的字段名称(在此示例中为W,P和E),但是,这些结构的顺序可以是任意的(您在评论中提到这对您的应用程序很重要)。

function X = structplus(S, M)
fn = fieldnames(S);
for i = 1 : numel(fn)
  X.(fn{i}) = M.(fn{i}) + S.(fn{i});
end
end

所以定义

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

答案 1 :(得分:2)

要扩展Le Phlaux的答案,您可以为所需的二元运算符(例如@plus@minus)提供函数句柄,并递归地处理子结构

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);