How to Validate User Input in MATLAB?

AI Thread Summary
The discussion focuses on validating user input in MATLAB by appending error codes based on specific conditions. The user is attempting to check if the input is numeric, integer-valued, within a specified range, and has the correct dimensions. Issues arise when the code produces unexpected error codes for certain inputs, indicating problems with the validation logic. A key suggestion is to change the dimension check to use the `isequal` function for accurate size comparison. Proper indentation and clarity in the code structure are also emphasized for better readability and debugging.
gfd43tg
Gold Member
Messages
947
Reaction score
48

Homework Statement



Often times, a program accepts input from a user, and needs to check the validity of the input, and
then produce useful and informative error messages if the input is invalid. Suppose that uiVal is a
variable representing the user's input, and that errorCode is an 1-by-0 empty array. Write Matlab
code that appends to errorCode various identifying integers depending on certain conditions as
follows:

1, if uiVal is not a numeric, real-valued array
2, if uiVal is not all integer valued. Note that if uiVal is not numeric, real-valued (as is
checked in the rst item) then this condition should not be checked, since it may produce
an error.
3, if any values of uiVal are less than 1 or greater than 6. Note that if uiVal is not numeric,
real-valued (as is checked in the rst item) then this condition should not be checked, since
it may produce an error.
4, if uiVal is not 2-dimensional (use command ndims) or it's size is not equal to 1-by-4.

Homework Equations


The Attempt at a Solution


Right now my code is getting 4/7, I can't figure out what is wrong. Everything seems fine in the code, but when I run uiVal = @sign it gives errorCode = [1 1]

Code:
errorCode = zeros(1,0);
if ~(isnumeric(uiVal) && isreal(uiVal))
    errorCode = [errorCode, 1];
else
    if (uiVal ~= round(uiVal))
       errorCode = [errorCode, 2];
    end 
    if (any(uiVal < 1) | any(uiVal > 6))
    errorCode = [errorCode, 3];
    end 
end
    if ndims(uiVal)~= 2 | size(uiVal) ~= [1,4]
    errorCode = [errorCode, 4];
    end

This is the autograder remarks:
Code:
Problem 3: 4/7
*the value of errorCode is incorrect for the variables: uiVal = '[1 2 3 4]'; 
The size of your variable is not as expected
*the value of errorCode is incorrect for the variables: uiVal = [1 2 3 4 5]; 
The size of your variable is not as expected
*the value of errorCode is incorrect for the variables: uiVal = @sign; 
The size of your variable is not as expected
 
Last edited:
Physics news on Phys.org
Im not sure what's causing your problem but you need to properly indent your code for clarity.

The if ndims... statement block should be outdented tight?

I ran it on Freemat and it seemed to work so here's the console printout. I didn't try all cases:

Code:
 FreeMat v4.0
 Copyright (c) 2002-2008 by Samit Basu
 Licensed under the GNU Public License (GPL)
 Type <help license> to find out more
      <helpwin> for online help
      <pathtool> to set or change your path
 Use <dbauto on/off> to control stop-on-error behavior
 Use ctrl-b to stop execution of a function/script
 Use <rootpath gui> to set/change where the FreeMat toolbox is installed
--> errorCode = zeros(1,0);
if ~(isnumeric(uiVal) && isreal(uiVal))
    errorCode = [errorCode, 1];
else
    if (uiVal ~= round(uiVal))
       errorCode = [errorCode, 2];
    end
    if (any(uiVal < 1) | any(uiVal > 6))    errorCode = [errorCode, 3];
    end
end
    if ndims(uiVal)~= 2 | size(uiVal) ~= [1,4]
    errorCode = [errorCode, 4];
-->     endError: Undefined function or variable uiVal
-->     end
Error: Undefined function or variable uiVal
--> uiVal=[1,2,3,4]
uiVal =
 1 2 3 4
--> errorCode = zeros(1,0);
if ~(isnumeric(uiVal) && isreal(uiVal))
    errorCode = [errorCode, 1];
else
    if (uiVal ~= round(uiVal))
       errorCode = [errorCode, 2];
    end
    if (any(uiVal < 1) | any(uiVal > 6))    errorCode = [errorCode, 3];
    end
end
    if ndims(uiVal)~= 2 | size(uiVal) ~= [1,4]
    errorCode = [errorCode, 4];
-->     end
--> print errorCode
--> errorCode
ans =
  Empty array 1 0
--> uiVal=[ 12.3, 14, 15.6 16]
uiVal =
 Columns 1 to 3
   12.3000   14.0000   15.6000
 Columns 4 to 4
   16.0000
--> errorCode = zeros(1,0);
if ~(isnumeric(uiVal) && isreal(uiVal))
    errorCode = [errorCode, 1];
else
    if (uiVal ~= round(uiVal))
       errorCode = [errorCode, 2];
    end
    if (any(uiVal < 1) | any(uiVal > 6))    errorCode = [errorCode, 3];
    end
end
    if ndims(uiVal)~= 2 | size(uiVal) ~= [1,4]
    errorCode = [errorCode, 4];
-->     end
--> errorCode
ans =
 2 3
--> uiVal=['a','b','c','d']
uiVal =
abcd
--> errorCode = zeros(1,0);
if ~(isnumeric(uiVal) && isreal(uiVal))
    errorCode = [errorCode, 1];
else
    if (uiVal ~= round(uiVal))
       errorCode = [errorCode, 2];
    end
    if (any(uiVal < 1) | any(uiVal > 6))
    errorCode = [errorCode, 3];
    end
end
    if ndims(uiVal)~= 2 | size(uiVal) ~= [1,4]
    errorCode = [errorCode, 4];
-->     end
--> errorCode
ans =
 1
 
The problem was this statement
Code:
if ndims(uiVal)~= 2 | size(uiVal) ~= [1,4]

it was changed to

Code:
if ndims(uiVal)~= 2 | isequal(size(uiVal), [1,4])
 
Back
Top