我一直在努力解决这个问题大约一个星期。我一直在尝试出于研究目的将脚本转换为函数。问题在于代码中有很多条件式的变量现有语句,因此在检查某些变量时工作空间中将不存在某些变量(这就是为什么它可以很好地用作脚本的原因)。
Varargin不能解决此问题,因为某些功能INPUTS将不存在。
工作区
var1 = 1
var2 = 2
var4 = 4
要转换为功能的代码
if exist('var3','var')
disp('var 3 exists')
else
disp('var 3 does not exist')
end
以下函数将不起作用,因为它正在调用不存在的变量3。
呼叫功能
runCode(var1, var2, var3, var4)
我最初是在我的函数之前编写此函数的,并且对isnan
而不是exist
进行了代码检查,但这不是很好的做法,并且由于经常调用该函数,因此我不必只要更改代码,就更新此功能设置。
if ~exist("var1", "var"), var1= NaN; end
if ~exist("var2", "var"), var2= NaN; end
if ~exist("var3", "var"), var3= NaN; end
if ~exist("var4", "var"), var4= NaN; end
我不想使用eval
,由于存在大量数字,并且加载工作区已经给我带来了问题,并且混乱了代码后面的数字。我唯一知道的想法是为先前的if语句提供一个安装脚本,或者以某种方式将所有工作空间数据保存到结构或某种东西中,然后为值分配相应的who
字符串(提供工作空间变量名称)
感谢您可能提出的任何想法
答案 0 :(得分:3)
当前脚本的行为会有所不同,具体取决于存在一组具有预定义名称的变量。这很难在函数中复制,因为函数应该不读取调用工作区的值。当然可以这样做:
try
var1 = evalin('caller','var1');
catch
% do nothing, the variable doesn't exist in the caller, it won't exist here
end
但这是确实的错误做法,与脚本没有什么不同。 OP明确表示不想使用eval
。
有一种选择,我犹豫不决,因为它几乎和上面一样邪恶。我们将定义一个函数,其输入参数不是基于顺序,而是基于名称:
runCode(var1)
行为将不同于
runCode(var2)
但是以下两个语句的行为相同:
runCode(var1,var2)
runCode(var2,var1)
歪斜吗?你应该是!
技巧是使用inputname
如下:
function runCode(varargin)
for ii = 1:nargin
switch inputname(ii)
case 'var1', var1 = varargin{ii};
case 'var2', var2 = varargin{ii};
case 'var3', var3 = varargin{ii};
case 'var4', var4 = varargin{ii};
otherwise, error('Illegal input argument')
end
end
该函数的其余部分将是OP脚本的主体,其中包含以下代码:
if exist('var1','var')
% ...
end
也就是说,首先我们看到将哪些变量传递给函数,其次我们看到存在哪些变量。应该可以重写脚本本身,以将exist
检查替换为对输入参数名称列表的查找。
答案 1 :(得分:2)
您可以将输入设为arg对,因此您可以这样称呼:
runCode ( 'var1', 123, 'var2', 456, 'var4', 789)
函数在哪里
function runCode ( varargin )
defaults.var1 =[];
defaults.var2 =[];
defaults.var3 =[];
defaults.var4 =[];
for ii = 1:2:nargin
if isfield ( defaults, varargin{ii} )
defaults.(varargin{ii}) = varargin{ii+1};
else
Throw error?
end
然后,您更改对var3的检查,以检查值defaults.var3
是否为空。
答案 2 :(得分:0)
感谢所有反馈。由于有时要从同一位置调用我要调用的函数,但是存在不同的变量,因此无法更改参数的设置方式。因此,我所做的可能会让你们哭泣,但是我有一个安装脚本,在该函数之前调用该脚本,以检查参数是否存在,如果不存在,则将其设置为NaN。它与我以前使用脚本完全相同的解决方案。
PS我同意应该将其保留为脚本,但他们确实希望它是一个功能__(ツ)_ /¯