我有一个名为"parameters.mat"的工作空间,其中包含许多变量(实际上是常量),这些变量在我的模拟过程中被多种方法使用。我希望将这些放在一个工作区中的原因是将它们放在方便用户更改的地方。
我想在类方法中访问这些变量。我已经找到了两种方法,我想知道哪一种被认为更好(或者如果有更好的方法的话):
-
首先加载工作区,作为基本工作区,每当我想在方法中使用其中的变量时,我都会首先调用
evalin('base', 'variable_name')
。 -
只要我需要,就在方法中加载工作区。这很有效,但当我在中使用未定义的变量名时,它会给我一个警告方法的其余部分(因为MATLAB不知道它会从工作空间加载)。有没有一种干净的方法可以删除此警告?
可能最干净的方法是使用包装函数。基于我的评论,假设您的参数常量在文件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
(或类似的,请参阅清除)或Matlab会话结束。这样做的一个缺点是,如果您更改了mat文件,则必须使用clear all
才能使param()
重新读取它
另一方面,如果您的垫文件确实仅由几个数字组成,则可能根本不需要垫文件:
function value = param(name)
s.x0 = 1;
s.epsilon = 1;
s.dt = 0.01;
value = getfield(s, name);
通过这种方法,函数param()
不再是包装器,而是存储参数值的中心位置,而不是mat文件。