Documentation Center

  • Trial Software
  • Product Updates

Pass Scalar Values

Pass Scalar as Matrix

This example shows how to write a MEX-file that passes scalar values.

Suppose that you have the following C code, timestwo, that takes a scalar input, a 1-by-1 matrix, and doubles it.

void timestwo(double y[], double x[])
{
  y[0] = 2.0*x[0];
  return;
}

C Code Analysis

To see the function written as a MEX-file, open the fileopen the file, timestwo.c, in the MATLAB® Editor.

In C/C++, the compiler checks function arguments for number and type. However, in MATLAB, you can pass any number or type of arguments to a function; the function is responsible for argument checking. MEX-files also allow variable inputs. Your MEX-file must safely handle any number of input or output arguments of any supported type.

This code checks for the proper number of arguments.

if(nrhs!=1) {
  mexErrMsgIdAndTxt( "MATLAB:timestwo:invalidNumInputs",
    "One input required.");
} else if(nlhs>1) {
  mexErrMsgIdAndTxt( "MATLAB:timestwo:maxlhs",
    "Too many output arguments.");
}

This code checks if the input is a scalar double value.

mrows = mxGetM(prhs[0]);
ncols = mxGetN(prhs[0]);
if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||
    !(mrows==1 && ncols==1) ) {
  mexErrMsgIdAndTxt( "MATLAB:timestwo:inputNotRealScalarDouble",
    "Input must be a noncomplex scalar double.");
}

Build and Test Example

Build the MEX-file.

mex -v timestwo.c

Call the function.

x = 2;
y = timestwo(x)
y =
     4

Pass Scalar by Value

This example shows how to write a MEX-file that passes a scalar by value.

The mxGetScalar function returns the value of a scalar instead of a pointer to a copy of the scalar variable, x.

The following C code implements the timestwo_alt function.

void timestwo_alt(double *y, double x)
{
  *y = 2.0*x;
}

Compare the timestwo_alt function signature with the timestwo function signature.

void timestwo_alt(double *y, double x)
void timestwo(double y[], double x[])

The input value x is a scalar of type double. In the timestwo function, the input value is a matrix of type double.

To see the function written as a MEX-file, open the fileopen the file, timestwoalt.c, in the MATLAB Editor.

Compare the call to timestwo_alt to the call to timestwo.

  /* Get the scalar value of the input x */
  /* note: mxGetScalar returns a value, not a pointer */
  x = mxGetScalar(prhs[0]);

  /* Assign a pointer to the output */
  y = mxGetPr(plhs[0]);
  
  /* Call the timestwo_alt subroutine */
  timestwo_alt(y,x);
  /* Assign pointers to each input and output. */
  x = mxGetPr(prhs[0]);
  y = mxGetPr(plhs[0]);
  
  /* Call the timestwo subroutine. */
  timestwo(y,x);

The value x, created by mxGetScalar, is a scalar not a pointer.

Was this topic helpful?