使用具有可选输入参数的功能

时间:2018-08-31 20:27:08

标签: matlab function scripting optional-parameters variable-declaration

我一直在努力解决这个问题大约一个星期。我一直在尝试出于研究目的将脚本转换为函数。问题在于代码中有很多条件式的变量现有语句,因此在检查某些变量时工作空间中将不存在某些变量(这就是为什么它可以很好地用作脚本的原因)。

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字符串(提供工作空间变量名称)

感谢您可能提出的任何想法

3 个答案:

答案 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我同意应该将其保留为脚本,但他们确实希望它是一个功能__(ツ)_ /¯