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?
Was sind Ihre Eingaben? – excaza