我有一个名为" parameters.mat"的工作空间,它包含我的模拟中几种方法使用的许多变量(实际上是常量)。我想在一个工作区中使用它们的原因是将它们放在一个方便的地方供用户更改。
我想在类方法中访问这些变量。我已经找到了两种方法,我想知道哪一种方法更好(或者可能更好的方式):
将工作区加载到其他任何地方之前,作为基础工作区,每当我想在方法中使用其中的变量时,我先调用evalin('base', 'variable_name')
。
每当我需要时,在方法中加载工作区。这有效, 但是当我使用未定义的变量名时,它会给我一个警告 方法的其余部分(因为MATLAB不知道它会是 从工作区加载)。是否有一种清除方法可以删除此警告?
答案 0 :(得分:2)
最简洁的方法可能是使用包装函数。假设您的参数常量位于文件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);
现在,只有在第一次调用param()
时才会读取mat文件。持久变量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文件的中心位置。