通过函数向现有结构或变量添加字段,而无需重命名或销毁原始结构

时间:2014-07-25 17:58:47

标签: matlab

想象一下以下结构:

A.B1 = 1:42;
A.B2 = 'Hello World!'

现在我想做一些操作,但是备份新子结构中的现有数据。

A.B1.C1 = A.B1;
A.B1.C2 = mean(A.B1.C1);

这两行(作为示例)我想放入一个函数,所以我的脚本看起来如下:

A.B1 = 1:42;
A.B2 = 'Hello World!'
myfunction(A.B1)

我的工作区应该看起来像:

A = 

    B1: [1x1 struct]
    B2: 'Hello World!'

A.B1 =

    C1: [1x42 double]
    C2: 21.5

但是我无法以这种方式创建该函数,我的原始结构A不会被破坏。除此之外,我的功能输入可能是W.X.Y,之后我想获得W.X.Y.Z1W.X.Y.Z2。它也可以是一个简单的向量A = 1:42,之后应该是A.B1A.B2

有任何建议吗?

我可以使用fieldnamesassignin('base',...)制作一些丑陋的东西 - 但这真的是要走的路吗?


编辑:一个主要问题是函数inputname不适用于结构。因此,如果我将A传递给我的函数,我可以使用fieldnames来获取B1B2的名称,但我无法找到什么是最初的字段名称" A"。如果A在我的函数中变为inputname(1),则返回 'A' 。对于结构,输出为空。


类和方法是解决方案吗?不幸的是,我根本不熟悉OOP ......

1 个答案:

答案 0 :(得分:3)

我唯一能看到的就是:

function [out] = myfunction(in)

    out.base = in;
    out.compute = mean(in);

end

当你想使用你的功能时,你必须提供相同的输入/输出变量:

A.B1 = 1:42;
A.B2 = 'Hello World!'
A.B1 = myfunction(A.B1);

也可以进行多项输入:

function [varargout] = myfunction(varargin)

for ii = 1:nargin

    out.base = varargin{ii};
    out.compute = mean(out.base);
    varargout{ii} = out; 

end

end

只要输出变量的符号与其相应的输入变量相同:

W.X.Y1 = 1:42;
W.X.Y2 = 'Hello world!';

A.B1 = 100:-1:0;
A.B2 = 'Goodbye cruel world!' 

[W.X.Y1,A.B1] = myfunction(W.X.Y1,A.B1)