Use Validation Functions to Avoid Unwanted Class and Size Conversions
When an argument value that is passed to a function does not match the class and size required by the validation, MATLAB® converts the value to the declared class and size when conversion is possible. To avoid the standard conversions performed by MATLAB from argument validation, use validation functions instead of class and size restrictions. Calls to validation functions do not return values and cannot change the value of the argument.
For example, this function restricts the first input to a two-dimensional array of any
size that is of class double
. The second input must be a 5-by-3 array of any
class.
function f(a,b) arguments a (:,:) double b (5,3) end % Function code end
Because of standard MATLAB type conversion and scalar expansion, you can call this function with the following inputs and not receive a validation error.
f('character vector',144)
By default, MATLAB converts the elements of the character vector to their equivalent numeric value
and applies scalar expansion to create a 5-by-3 array from the scalar value
144
.
Using specialized validation functions can provide more specific argument validation. For example, this function defines specialized validation functions that it uses in place of the class and size specifications for the first and second arguments. These local functions enable you to avoid input value conversions.
mustBeOfClass
restricts the input to a specific class without allowing conversion or subclasses. For a related function, seemustBeA
.mustBeEqualSize
restricts two inputs to be of equal size without allowing scalar expansion. For a related function, seemustBeScalarOrEmpty
.mustBeDims
restricts the input to be of a specified dimension without allowing transposition or scalar expansion. For a related function, seemustBeVector
.
function fCustomValidators(a,b) arguments a {mustBeOfClass(a,'double'), mustBeDims(a,2)} b {mustBeEqualSize(b,a)} end % Function code end % Custom validator functions function mustBeOfClass(input,className) % Test for specific class name cname = class(input); if ~strcmp(cname,className) eid = 'Class:notCorrectClass'; msg = 'Input must be of class %s.'; error(eid,msg,className); end end function mustBeEqualSize(a,b) % Test for equal size if ~isequal(size(a),size(b)) eid = 'Size:notEqual'; msg = 'Inputs must have equal size.'; error(eid,msg) end end function mustBeDims(input,numDims) % Test for number of dimensions if ~isequal(length(size(input)),numDims) eid = 'Size:wrongDimensions'; msg = ['Input must have ',num2str(numDims),' dimension(s).']; error(eid,msg,numDims) end end
Use fCustomValidators
to test the mustBeOfClass
function. The first argument is not of class double
, so the function returns an
error.
fCustomValidators('character vector',144)
Error using fCustomValidators fCustomValidators('character vector',144) ↑ Invalid argument at position 1. Input must be of class double.
In this call, the number of dimensions of the first input is wrong, so the validation function returns a custom error message.
fCustomValidators(ones(2,2,4),144)
Error using fCustomValidators fCustomValidators(ones(2,2,4),144) ↑ Invalid argument at position 1. Input must have 2 dimension(s).
The mustBeEqualSize
validator function checks to see if the inputs
are of the same size.
fCustomValidators(ones(2,2),144)
Error using fCustomValidators fCustomValidators(ones(2,2),144) ↑ Invalid argument at position 2. Inputs must have equal size.
For related predefined validation functions, see mustBeA
,
mustBeFloat
, and
mustBeVector
.