2016-07-07 2 views
3

Ich verwende InputParser, um Eingaben in eine adaptive Schwellenwertoperation in Matlab 2016a zu validieren.anomales Verhalten in MATLAB inputParser

Der Eingang ist:

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

wo der Name-Wert-Paare 'meanWindow', 8 und 'varianceWindow', 8 von Interesse sind.

Die inputParser ist eine lokale Funktion in der gleichen Datei wie 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 

ich als Validierungsfunktion @isint. iSINT wird als eine lokale Funktion in der gleichen Datei wie AdaptBinarize2() definiert:

function bool = isint(x) 

epsilon = 10^-9; 

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

end 

Wenn das Eingangs Eingabe I erhalten die Fehlermeldung:

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) = wahr. Wenn ich das MeanWindow-Check-Handle zu @isnumeric ändere, ist das Parsen erfolgreich. Alle anderen Plausibilitätsprüfungen, die @isint pass verwenden. Einschließlich varianceWindow, die gleichzeitig mit dem gleichen Wert eingegeben wird und noch läuft.

Beim Extrahieren der Werte aus der inputParser-Struktur nach dem Ändern der @ isint in @ isnumeric sind die Werte identisch mit dem gleichen Datentyp.

Wenn ich die Zeilen von meanWindow und varianceWindow in inputParser wechseln, passiert genau das gleiche Verhalten in umgekehrter Reihenfolge, wobei varianceWindow fehlschlägt, es sei denn, ich ändere den Test und meanWindow passing. Die Reihenfolge der Eingaben scheint keine Auswirkungen zu haben.

Was passiert und warum?

+0

Was sind Ihre Eingaben? – excaza

Antwort

0

Ich denke, Sie müssen addParameter statt addOptional verwenden.

addOptional zeigt an, dass das Argument ein optionales Argument ist. Optionale Argumente folgen auf das erste Argument, müssen in der richtigen Reihenfolge sein, aber spätere Argumente können weggelassen werden und werden durch Standardwerte ersetzt.

addParameter zeigt an, dass das Argument ein Parameter-Wert-Paar ist. Parameter-Wert-Paarargumente können in beliebiger Reihenfolge vorkommen und werden als Paar mit dem Namen des Arguments und seinem Wert übergeben.

PS vor R2013b, verwenden Sie addParamValue statt addParameter.

0

Macht nichts, Gummi duckte es. Die Syntax war falsch, ich dachte, dass addOptional() wie addParameter() funktionieren würde. addOptional() ist ein Positionsargument, daher reicht der Name string-identifier nicht aus, um Dinge an die richtigen Stellen zu schieben. addParameter() kann sie nur mit dem Namen sortieren, wie ich es versucht habe.

Also statt einer guten Routine, die anomale Verhalten zeigt, hatte ich eine gebrochene Routine, die rein zufällig funktioniert hat. Es gab sogar Bilder aus, die so aussahen wie ich es erwartet hatte, wenn die Eingänge gemischt wurden!