2016-07-07 14 views
3

私は、InputParserを使用してMatlab 2016aの適応型しきい値処理ルーチンへの入力を検証しています。MATLAB inputParserの異常動作

入力される:

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

名前と値のペア 'meanWindow'、8と 'varianceWindow'、8は興味深いものです。

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使用しています:

inputParserのはAdaptBinarizeと同じファイル内のローカル関数です。 isintはAdaptBinarize2()と同じファイル内のローカル関数として定義される:

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)真=:

function bool = isint(x) 

epsilon = 10^-9; 

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

end 

入力を入力し、私はエラーメッセージが表示されます。 meanWindowチェックハンドルを@isnumericに変更すると、解析が成功します。 @isintを使う他のすべての健全性チェックは成功します。同じ値で同時に入力され、それでも渡されるvarianceWindowを含みます。

@isintを@isnumericに変更した後にinputParser構造体から値を抽出すると、値は同じデータ型で同じになります。

私がinputParserのmeanWindowとvarianceWindowの行を切り替えると、testとmeanWindowの受け渡しを変更しない限り、varianceWindowが失敗しても全く同じ動作が逆になります。入力の順序は何の効果もないようです。

何が起こり、なぜですか?

+0

あなたの入力は何ですか? – excaza

答えて

0

addOptionalではなくaddParameterを使用する必要があると思います。

addOptionalは、引数がのオプションの引数であることを示します。オプションの引数は最初の引数の後に続くが、順番に並んでいなければならないが、後のものは省略することができ、デフォルトに置き換えられる。

addParameterは、引数がのパラメータ値のペアであることを示します。パラメータと値のペアの引数は、任意の順序で指定することができ、引数の名前とその値との組として渡されます。

PSがR2013bより前の場合は、addParameterではなくaddParamValueを使用してください。

0

気にしないで、ゴムはそれを避けた。構文は間違っていましたが、addOptional()はaddParameter()が実際に動作するように動作します。 addOptional()は位置指定の引数なので、string-identifierという名前は適切な場所にプッシュするのに十分ではありません。 addParameter()は、私が試したような名前だけでソートすることができます。

異常行動を示す良いルーチンを使用する代わりに、純粋に偶然に働く壊れたルーチンがありました。それは入力をシャッフルして私が期待したように見える画像を出力します。