matlab - MATLAB inputParser 中的异常行为

标签 matlab parsing

我正在使用 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) = true。如果我将meanWindow检查句柄更改为@isnumeric,则解析成功。所有其他使用 @isint 的健全性检查都通过。包括varianceWindow,同样的值同时输入,仍然通过。

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

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

发生了什么以及为什么?

最佳答案

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

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

addParameter 表示参数是一个参数值对。参数-值对组参数可以按任何顺序出现,并以参数名称及其值作为对进行传递。

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

关于matlab - MATLAB inputParser 中的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38244625/

相关文章:

c++ - OpenCV如何提取图像 channel

matlab - 查找两个像素之间的距离的最简单方法是什么?

matlab - 调用堆栈返回后向量中的变量变回

arrays - 在 MATLAB regexpr 中使用数组项作为替换

javascript - Chrome 扩展程序 - 解析 Gmail 邮件

c++ - 如何用 EXIF 数据写入图像 (Matlab/C++)

java - 从文件输入/变量 Java 中解析长文本

c - 使用 C 解析 URL 的最佳方法?

python - 从列名构建列表 Pandas DataFrame

parsing - Attoparsec 在大型 'take' 调用上分配大量内存