Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to enforce input argument data types in MATLAB?

I would like to ensure that the input arguments to a user-defined MATLAB function (contained in an m-file) are of a certain type. I understand that MATLAB automatically assigns data types to variables (to the liking of some and the dismay of others), but I would like to know if there is an option of "strict data typing" in MATLAB, or something of the sort, especially for input arguments for a user-defined function.

I found a helpful explanation of MATLAB's "fundamental classes" (data types) at these two webpages:

http://www.mathworks.com/help/matlab/matlab_prog/fundamental-matlab-classes.html http://www.mathworks.com/help/matlab/data-types_data-types.html

However, I have been unable to find an answer to the question of strict data typing, particularly for function input arguments. I thought it would be a pretty basic question that already had been answered in numerous places, but after extensive searching I have not yet found a conclusive answer. For now, I have been manually checking the data type using the is[TYPE]() functions and displaying an error message if it does not comply, though this seems sloppy and I wish I could just get MATLAB to enforce it for me.

Below is an example of a function in which I would like to specify the input argument data type. It resides in a file called strict_data_type_test.m in MATLAB's current path. In this function, I would like to force the variable yes_or_no to be of MATLAB's logical data type. I know I can use the islogical() function to manually check, but my question is if it is possible to have MATLAB enforce it for me. I also know that any non-zero double evaluates to true and a zero evaluates to false, but I want to force the user to send a logical to make sure the wrong argument was not sent in by accident, for example. Here is the example function:

function y = strict_data_type_test( x, yes_or_no )

    % manual data type check can go here, but manual check is not desirable

    if (yes_or_no)
        y = 2 .* x;
    else
        y = -5 .* x;
    end

end

Adding the data type before the input argument variable name (like in most programming languages) treats the data type text as another variable name instead of a data type identifier. From that it would seem that strict data typing is not possible in MATLAB by any means, but maybe one of you many gurus knows a useful trick, feature, or syntax that I have not been able to find.

like image 847
Babak Avatar asked Feb 05 '14 17:02

Babak


People also ask

How do you get input arguments in MATLAB?

Number of ArgumentsDefine a function that accepts a variable number of input arguments using varargin . The varargin argument is a cell array that contains the function inputs, where each input is in its own cell. Define a function that returns a variable number of output arguments using varargout .

What changes the data type of argument in MATLAB?

R2021b: The newclass input argument is case-sensitiveYou must specify newclass as a character vector or a string of lowercase letters that represents the new data type. For example, to convert a double value to the int8 data type, you must use cast(1.234,"int8") . The command cast(1.234,"Int8") now errors.

Why does MATLAB say not enough input arguments?

If your function requires input arguments, the Not enough input arguments error will occur as you have written a functions that expects inputs to go inside the function. Therefore, you cannot expect the function to run by simply pushing the Run button.

Which predefined function is used to validate arguments?

Validation Functions A validation function is a MATLAB function that throws an error if certain requirements are not satisfied by the argument value. Validation functions do not return values and, unlike class and size, cannot change the value of the arguments they are validating.


2 Answers

validateattributes might also work for you, if there is an appropriate attribute for your case. For example if you want to enforce that yes_or_no is a logical scalar, you could try:

validateattributes(yes_or_no,{'logical'},{'scalar'})

Otherwise maybe an attribute like 'nonempty'.

like image 109
Kim Avatar answered Sep 17 '22 14:09

Kim


I've gotten some great responses so I can't pick just one as the "accepted answer", but to summarize what I've learned from you all so far:

  • No, MATLAB does not have built-in strict data typing for function input arguments
  • MATLAB compiles the code before running, so manual validation checking should not be very taxing on performance (the profiler can be used to assess this)
  • Many helpful methods of doing the manual validation checking exist, listed here in order of most relevant to least relevant for what I was trying to do:
    • inputParser class
    • validateattributes()
    • Error/exception handling (throw(), error(), assert(), etc.)
    • MATLAB's built-in state detection functions (a.k.a predicate functions)
  • I can look through some MathWorks-provided MATLAB functions (or Statistics toolbox functions) for ideas on how to validate input arguments by typing edit followed by the function name. Two suggested functions to look at are normpdf() (from the Statistics toolbox) and integral(). Some other functions I found helpful to look at are dot() and cross().

Other thoughts:

  • It would appear that the inputParser class was the overall concensus on the most professional way to validate input arguments. It was noted on a related (but not duplicate) stackoverflow post that the newer MathWorks functions tend to make use of this class, suggesting that it may be the best and most up-to-date choice.
  • Since the MathWorks-provided MATLAB functions do not appear to enforce strict input argument data typing, this further suggests that even if it was possible to do so, it may not be a recommended approach.
  • MATLAB seems to regard "error handling" and "exception handling" as two different concepts. For example, here are two links to MATLAB's Documentation Center that show how MathWorks considers "error handling" and "exception handling" differently: MathWorks Documentation Center article on Error Handling, MathWorks Documentation Center article on Exception Handling. A relevant StackOverflow post has been made on this topic and can be found here (link). I contacted MathWorks and added some new information about this topic to that post, so if you are interested you may read more by following that link.
like image 21
Babak Avatar answered Sep 19 '22 14:09

Babak