我正在使用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传递。输入顺序似乎没有任何影响。
发生了什么以及为什么?
答案 0 :(得分:0)
没关系,橡胶躲了起来。语法错了,我虽然addOptional()会像addParameter()一样工作。 addOptional()是一个位置参数,因此名称string-identifier不足以将东西推送到正确的位置。 addParameter()可以使用我试过的名称对它们进行排序。
因此,我没有一个表现出异常行为的良好程序,而是一个完全按机会运作的破坏程序。它甚至输出看起来像我预期的输入洗牌的图像!
答案 1 :(得分:0)
我认为您需要使用addParameter
而不是addOptional
。
addOptional
表示该参数是可选参数。从第一个参数开始的可选参数必须按顺序排列,但后面的参数可以省略并替换为默认值。
addParameter
表示该参数是参数值对。参数 - 值对参数可以按任何顺序排列,并作为参数名称及其值传递。
在R2013b之前的PS,使用addParamValue
而不是addParameter
。