【问题标题】:matlab: is there a way to import/promote variables from a structure to the current workspace?matlab:有没有办法将变量从结构导入/提升到当前工作区?
【发布时间】:2012-03-29 00:05:46
【问题描述】:
function y = myfunc(param)
C = param.C;
L = param.L;
Kp = param.Kp;
Ki = param.Ki;
...

有没有办法概括上面的代码?我知道如何使用fieldnames()getfield() 来概括结构访问,但不知道如何在不调用eval() 的情况下设置变量(这是邪恶的)。

for n = fieldnames(param)'
  name = n{1};
  value = param.(name);
  do_something_with(name,value);   % ????

【问题讨论】:

    标签: matlab workspace


    【解决方案1】:

    没关系,我想通了;这个辅助函数有效:

    function vars_pull(s)
        for n = fieldnames(s)'
            name = n{1};
            value = s.(name);
            assignin('caller',name,value);
        end
    

    【讨论】:

    • 奖励积分让您的 FOR 循环直接遍历字段名,而不是提取字段名然后循环该单元格数组的长度 :-)
    【解决方案2】:

    创建名称在运行时确定的变量的唯一方法是使用evalevalinfevalassignin 之类的函数。 (assignin 是最不邪恶的选择顺便说一句,至少您不需要将您的值转换为字符串并返回。)

    但是,我质疑您为什么要这样做,为什么不根据需要通过输入结构访问值。如果你想节省打字(根据经验,因为我非常懒惰),我通常将我的输入参数结构命名为简短的名称,例如p。在我的整个代码中,我只是直接访问字段(例如p.Kp,一段时间后我什至看不到p.。)这也使得根据需要将结构传递给子函数变得容易。

    【讨论】:

    • 除了惰性/清晰性之外,我还使用sim() 命令在一个模型上调用 Simulink,该模型具有从工作区访问的一堆增益块和其他参数。
    • 是的。对于那个 Simulink 接口,这是您需要做的,而您的自我回答就是这样做的方法。 (工作区变量只是偷偷摸摸的全局变量,这是我长期以来的挫败感,但在这里不相关。)
    • 我想将它用于来自已验证的 inputParser 的结构,但我希望这些值最终出现在我正在创建的类的属性中。那么为什么不从输入结构访问呢?因为这会破坏我正在创建的公共 API,并且我明确不想将该实现细节暴露给调用者。
    【解决方案3】:

    您可以使用 FileExchange 上的优秀提交:

    V2STRUCT - 将变量打包和解包到具有增强功能的结构中

    【讨论】:

      【解决方案4】:

      这里有一个解决方法:使用 '-struct' 选项将结构保存到 .mat 文件,然后立即重新加载它。这是结构变量X的示例:

      save('deleteme.mat','-struct','X');
      load('deleteme.mat');
      delete('deleteme.mat');
      

      它很笨拙,但实际上相当快,至少在使用 SSD 时是如此。

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 1970-01-01
        相关资源
        最近更新 更多