Для поддержки аргумента Linespec без вмешательства в параметры входного синтаксического анализатора, которые имеют имя из 4 символов или менее (например, 'grid' или 'bins'), у вас должен быть немного более сложный способ проверки правильности Linespec. аргумент чем '@ (x) ischar (x) && цифра (x) <= 4'. Эта проверка вернула бы true также для 'grid' и 'bins', хотя они не являются действительными аргументами Linespec. </p>
Следующая функция вернет true, только если введен действительный аргумент Linespec:
function isls = islinespec(x)
isls = false;
if ~ischar(x)
return;
end
lineStyleSpecifiers = {'--','-.','-',':'};
markerSpecifiers = {'square','diamond','pentagram','hexagram','+','o','*','.','x','s','d','^','v','>','<','p','h'};
colorSpecifiers = {'r','g','b','c','m','y','k','w'};
for oo=1:length(lineStyleSpecifiers)
k = strfind(x,lineStyleSpecifiers{oo});
if ~isempty(k)
x(k:(k+length(lineStyleSpecifiers{oo})-1)) = [];
break;
end
end
for oo=1:length(markerSpecifiers)
k = strfind(x,markerSpecifiers{oo});
if ~isempty(k)
x(k:(k+length(markerSpecifiers{oo})-1)) = [];
break;
end
end
for oo=1:length(colorSpecifiers)
k = strfind(x,colorSpecifiers{oo});
if ~isempty(k)
x(k:(k+length(colorSpecifiers{oo})-1)) = [];
break;
end
end
if isempty(x)
isls = true;
end
(Следует признать, что функция могла бы быть написана более элегантно с помощью регулярных выражений, но она делает свое дело.)
Пример использования:
parserObj = inputParser;
parserObj.KeepUnmatched = true;
parserObj.AddParamValue('legend',false);
parserObj.AddParamValue('grid',true);
parserObj.addOptional('LineSpec','-', @(x) islinespec(x));