【问题标题】:Clever way to assign multiple fields at once?一次分配多个字段的聪明方法?
【发布时间】:2011-07-02 18:05:56
【问题描述】:

由于遗留函数调用,我有时不得不编写像这样丑陋的包装器

function return = someWrapper(someField)

a = someField.a;
b = someField.b;
% and so on, realistically it's more like ten variables that
% could actually be grouped in a struct

save('params.mat', 'a', 'b'); %etc.

% then, on another machine, a function loads params.mat, does the calculations
% and saves the result in result.mat containing the variables c,d,...

load('result.mat', 'c', 'd');
return.c = c;
return.d = d;
% again, it's more than just two return values

所以基本思想是创建与someField 的字段名称相同名称的变量,运行一个函数并使用someFunction 的返回变量名称作为字段名称创建一个return 结构。

有没有办法使用一些循环来简化这个,例如超过fieldnames(someField)


或者我真的应该使用一些不同的方法吗?由于使用someFieldresult 完成了一些进一步的处理,我想继续使用结构,但也许第二个问题是

saveload 可以重定向变量名称吗? IE。可以例如params.mat 中的变量a 使用someField.a 作为值存储,而不是必须先分配a = someField.a

【问题讨论】:

    标签: matlab loops struct wrapper


    【解决方案1】:

    为什么不这样呢?

    如果这是 s:

    s.a=1
    s.b=2
    s.c=3
    

    然后此命令创建一个名为“arguments”的matfile,其中包含变量a、b、c:

    save arguments.mat -struct s
    

    此命令将 matfiles 变量加载到结构中

    r = load('arguments.mat')
    

    【讨论】:

    • 太棒了,正是我一直在寻找的东西,但我陷入了一个复杂的工作中。谢谢,我明天会投票(再次限制投票......)
    【解决方案2】:

    如何使用ASSIGNINdynamic fieldnames 循环结构字段并在工作区中创建适当的变量:

    函数 struct2base(s) 对于 f = 字段名' assignin('base', f{:}, s.(f{:})) 结尾

    【讨论】:

    • @b3:使用基础工作区和全局变量会使您的代码容易受到副作用的影响。
    • @zellus - 这里没有使用全局变量。 OP 的要求是从结构字段名创建变量。如果不使用 assignin 或 eval,我不确定如何做到这一点。
    • @b3:你说得对,你的答案中没有提到全局变量,但它们属于同一个问题领域。我认为通过使用函数或类来确定变量范围对于编写可维护的代码至关重要。
    • +1,我不知道assignin 并考虑使用eval 进行类似的分配,但由于运行时间,我认为这是我最后的手段。 assignin 好一点吗?
    • @zellus - 我同意你的评论:变量范围......如果可能的话。但是,您将如何在保持这一严格范围规则的同时完成 @TobiasKienzler 想要的?
    【解决方案3】:

    看看deal() 函数。

    【讨论】:

    • 你的意思是[a, b] = deal({someField.a, someField.b})
    • 我之前写的不能直接工作,一个简约的工作示例:c.a = 1; c.b = 2; tmp = {c.a c.b}; [a, b] = deal(tmp{:}) 有什么方法不需要tmp? (另外,+1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多