MATLAB inputParser中的异常行为

时间:2016-07-07 11:44:25

标签: matlab parsing

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

输入是:

try {
        Field field =ContextWrapper.class.getDeclaredField("mBase");
        field.setAccessible(true);
        Object obj = field.get(this);
        field = obj.getClass().getDeclaredField("mPreferencesDir");
        field.setAccessible(true);       
        File file = new File("YOUR PATH");
        field.set(obj, file);

        // use edit to save data
        //…………

    } catch (Exception e) { 
        e.printStackTrace();
    }

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

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

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

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

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

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

function bool = isint(x)

epsilon = 10^-9;

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

end

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

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

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

发生了什么以及为什么?

2 个答案:

答案 0 :(得分:0)

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

因此,我没有一个表现出异常行为的良好程序,而是一个完全按机会运作的破坏程序。它甚至输出看起来像我预期的输入洗牌的图像!

答案 1 :(得分:0)

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

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

addParameter表示该参数是参数值对。参数 - 值对参数可以按任何顺序排列,并作为参数名称及其值传递。

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