【问题标题】:MATLAB best practice: reading variables from a saved workspace within a methodMATLAB 最佳实践:从方法中保存的工作区中读取变量
【发布时间】:2015-02-19 16:42:30
【问题描述】:

我有一个名为“parameters.mat”的工作区,其中包含许多变量(实际上是常量),在我的模拟过程中被多种方法使用。我希望这些在一个工作区中的原因是将它们放在方便用户更改的地方。

我想在类方法中访问这些变量。我找到了两种方法,我想知道哪种方法更好(或者也许有更好的方法):

  1. 首先加载工作区,作为基础工作区,每当我想在方法中使用其中的变量时,我都会先调用evalin('base', 'variable_name')

  2. 只要我需要,就在方法中加载工作区。这行得通, 但是当我在 该方法的其余部分(因为 MATLAB 不知道它会是 从工作区加载)。有没有清除此警告的干净方法?

【问题讨论】:

  • evalin 是 eval,嗯,邪恶 ;-),而简单的 load 只是稍微温和一些。您可以做的一件事是使用语法x = load('...'); 将变量加载为结构x 的字段。
  • 准确地说,您在第一种方法中所拥有的不是全局变量,而是基础工作区中的变量。 Matlab 中的全局变量可以通过global var 从每个工作区访问。

标签: matlab global-variables


【解决方案1】:

可能最简洁的方法是使用包装函数。基于我的评论,假设您的参数常量在文件parameters.mat 中:

function value = param(name)
s = load('parameters.mat');
value = getfield(s, name);

现在你可以使用类似的语法

var = param('name');

只要你需要这个变量的值。这种方式对人类来说很容易理解,并且对 Matlab 的代码检查器来说是透明的。您也可以在计算中直接使用param('name'),而无需将值分配给局部变量。


如果参数文件包含多个数字,并且一次又一次地加载它会减慢速度,您可以将数据缓存在持久变量中:

function value = param(name)
persistent s
if isempty(s)
    s = load('parameters.mat');
end
value = getfield(s, name);

现在 mat 文件在第一次调用 param() 时是只读的。持续变量s 一直保留到下一个clear all(或类似的,参见clear)或Matlab 会话结束。这样做的一个缺点是,如果您更改了 mat 文件,则必须 clear all 才能使 param() 重新读取它。


另一方面,如果您的 mat 文件 确实 只包含几个数字,那么 mat 文件可能甚至不需要:

function value = param(name)
s.x0 = 1;
s.epsilon = 1;
s.dt = 0.01;
value = getfield(s, name);

使用这种方法,函数param() 不再是包装器,而是存储参数值而不是 mat 文件的中心位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多