MATLAB: Error when using validatestring in inputParser addOptional

addoptionalinputparservalitdatestring

I'm getting the following error when running isenExpan('a','m',2,1.4,'sub') with the code below:
??? Error using ==> isenExpan
Argument 'sonic' failed validation
@(x)validatestring(x,validSonic).
code:
function out = isenExpan(from,to,val,gam,varargin)
%%error checking
validTypes = {'m', 'a', 'p', 't', 'd'};
validSonic = {'super', 'sub'};
p = inputParser;
p.FunctionName = 'isenExpan';
p.addRequired('from', @(x)validatestring(x,validTypes));
p.addRequired('to', @(x)validatestring(x,validTypes));
p.addRequired('val', @isnumeric);
p.addRequired('gam', @(x)validateattributes(x,{'numeric'},{'>',1,'<',1.5}));
p.addOptional('sonic', 'super', @(x)validatestring(x,validSonic));
p.parse(from,to,val,gam,varargin{:});
I'm giving sonic a valid input, and when I step through itin debug mode, validatestring returns 'sub' and not false.
Has anyone else seen or heard of this problem?

Best Answer

Hi Kevin,
The problem lies in validatestring... from the docs: "the validatestring function returns the matching string in validstr". So it returns the matching string, rather than TRUE, FALSE, or nothing (as required by inputParser).
Try changing that line to:
p.addOptional('sonic', 'super', @(x)any(strcmp(x,validSonic)));
EDIT:
Actually, I can see why we would expect it to work... it seems that inputParser.parse has no trouble when validatestring returns the string (rather than an error) to a required argument, but it seems not to like the same validation of an optional argument... weird...
The proposed solution still works just as well, but I'm a little perplexed about why the problem occurred in the first place. Unfortunately inputParser.parse() is an internal MATLAB function, so there's no chance to follow the code inside and see why it goes wrong.