我有各种带有字段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
部分添加times
和methods
的功能。但是,这似乎需要大量重复的代码,我觉得必须有一个更简单的解决方案。任何建议都非常感谢。
答案 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);
。