【问题标题】:anomalous behaviour in MATLAB inputParserMATLAB inputParser 中的异常行为
【发布时间】:2016-07-07 20:38:26
【问题描述】:

我正在使用 inputParser 来验证 Matlab 2016a 中自适应阈值例程的输入。

输入是:

AdaptBinarize2(Image, 'WeightedNiblack', 'meanWeight', 0.3, 'varianceWeight', 0.5, 'meanWindow', 8, 'varianceWindow', 8);

名称-值对 'meanWindow', 8 和 'varianceWindow', 8 是有意义的。

inputParser 是与 AdaptBinarize 在同一文件中的本地函数:

function p = parseInputs(I, algorithm, varargin)

p = inputParser;

deft = 0.5; %default t, mean weight
defs = 2*floor((size(I,1)+size(I,2))/32)+1; %default s, window size
defk = 0; %default k, variance weight
defm = 128; %default m, Sauvola variance term (max variance of uint8)
defPol = 'Bright'; %foreground polarity, 'Bright' or 'Dark'
defGPU = 'False'; %whether to use CUDA

addRequired(p, 'I', @isnumeric);
addRequired(p, 'algorithm', @ischar);

addOptional(p, 'windowSize', defs, @isint);
addOptional(p, 'meanWindow', defs, @isint); %<--- this sucks
addOptional(p, 'varianceWindow', defs, @isint);

addOptional(p, 'meanWeight', deft, @isnumeric);
addOptional(p, 'varianceWeight', defk, @isnumeric);
addOptional(p, 'magicNumber', defm, @isint);

addOptional(p, 'polarity', defPol, @ischar);
addOptional(p, 'UseGPU', defGPU, @ischar);

parse(p,I,algorithm, varargin{:})

end

我使用@isint 作为验证函数。 isint 被定义为与 AdaptBinarize2() 相同的文件中的本地函数:

function bool = isint(x)

epsilon = 10^-9;

if mod(x, 1) < epsilon;
    bool = true;
else
    bool = false;
end

end

输入输入时,我收到错误消息:

Error using AdaptBinarize2>parseInputs (line 371)
The value of 'meanWindow' is invalid. It must satisfy the function: isint.

Error in AdaptBinarize2 (line 67)
p = parseInputs(I, algorithm, varargin{:}); 
%check all the name-value pairs and datatypes. local function.

isint(8) = 真。如果我将 meanWindow 检查句柄更改为 @isnumeric,则解析成功。所有其他使用@isint pass 的完整性检查。包括varianceWindow,它同时输入相同的值,仍然通过。

在将 @isint 更改为 @isnumeric 后从 inputParser 结构中提取值时,值与相同的数据类型相同。

如果我在 inputParser 中切换 meanWindow 和 varianceWindow 的行,完全相同的行为会反过来发生,varianceWindow 失败,除非我更改测试并且 meanWindow 通过。输入的顺序似乎没有任何影响。

发生了什么,为什么?

【问题讨论】:

  • 你的意见是什么?

标签: matlab parsing


【解决方案1】:

我认为您需要使用addParameter 而不是addOptional

addOptional 表示该参数是一个可选 参数。可选参数在第一个参数之后,必须按顺序排列,但后面的可以省略并被默认替换。

addParameter 表示参数是一个参数-值对。 Parameter-Value 对参数可以以任何顺序出现,并作为一对参数与参数名称及其值一起传入。

R2013b 之前的 PS,使用 addParamValue 而不是 addParameter

【讨论】:

    【解决方案2】:

    没关系,橡胶躲开了它。语法是错误的,我虽然 addOptional() 会像 addParameter() 一样工作。 addOptional() 是一个位置参数,因此名称 string-identifier 不足以将内容推送到正确的位置。 addParameter() 可以像我尝试的那样使用名称对它们进行排序。

    因此,我没有一个表现出异常行为的良好例程,而是有一个完全是偶然的坏例程。它甚至输出的图像看起来像我预期的那样,输入被打乱了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多