首页 > 解决方案 > Octave 中的 validateattributes 函数存在问题

问题描述

我正在尝试将一些 MATLAB 代码从 GitHub 移植到 Octave,并且在解析函数输入时遇到问题。有/是这样处理的可选输入参数:

% Optional parameter: maxLag
defaultMaxLag = 10 ;
checkMaxLag = @(x) validateattributes( x , { 'numeric' } , { 'positive' , 'numel' , 1 } ) ;

然后由以下处理inputParser

addOptional( parser , 'maxLag' , defaultMaxLag , checkMaxLag ) ;

如果我尝试按原样运行此代码,则会收到错误消息

error: mdDelay: argument 'MAXLAG' is not a valid parameter

我对最后一个代码片段的八度翻译是

addParamValue( parser , 'maxLag' , defaultMaxLag , checkMaxLag ) ;

这也失败了,但有错误消息

error: if: undefined value used in conditional expression
error: called from
validate_arg at line 521 column 9
parse at line 470 column 11 

问题似乎是匿名函数checkMaxLag,因为当我在终端中运行它时,我得到

error: value on right hand side of assignment is undefined

所以似乎validateattributes没有给出所需的返回值inputParser。有什么建议么?

标签: matlabparsinginputoctave

解决方案


addOptional您的问题与从toaddparamValue到 port的更改无关。问题只是这失败了(最近在较新版本上出现的错误消息):

octave> validate_lag = @(x) validateattributes (x, {'numeric'}, {'positive', 'numel', 1});
octave> p = inputParser ();
octave> p.addOptional ('maxLag', 10, validate_lag);
octave> p.parse (20)
error: failed validation of MAXLAG
Validation function: @(x) validateattributes (x, {'numeric'}, {'positive', 'numel', 1})

你被 Octave 的错误 #49793抓住了。基本上,inputParser需要一个返回 true 或 false 的验证函数。但是,validateattributes要么不返回任何内容,要么失败。我建议你这样做:

function rv = validateattributes_with_return_value (varargin)
  try
    validateattributes (varargin{:});
    rv = true;
  catch
    rv = false;
  end_try_catch
endfunction

然后你可以使用

validate_lag = @(x) validateattributes_with_return_value (x, {'numeric'}, {'positive', 'numel', 1});

推荐阅读