Handling Large mxArrays
in C MEX Files
Binary MEX files built on 64-bit platforms can handle 64-bit
mxArray
s. These large data arrays can have up to
248-1 elements. The maximum number of elements a sparse
mxArray
can have is 248-2.
Using the following instructions creates platform-independent binary MEX files as well.
Your system configuration can affect the performance of MATLAB®. The 64-bit processor requirement enables you to create the
mxArray
and access data in it. However, the system memory, in
particular the size of RAM and virtual memory, determine the speed at which MATLAB processes the mxArray
. The more memory available, the
faster the processing.
The amount of RAM also limits the amount of data you can process at one time in MATLAB. For guidance on memory issues, see Strategies for Efficient Use of Memory.
Using the 64-Bit API
The signatures of the API functions shown in the following table use the
mwSize
or mwIndex
types to work with a
64-bit mxArray
. The variables you use in your source code to
call these functions must be the correct type.
C mxArray
Functions Using
mwSize
/mwIndex
mxCalcSingleSubscript | mxGetJc |
mxCalloc | mxGetM |
mxCreateCellArray | mxGetN |
mxCreateCellMatrix | mxGetNumberOfDimensions |
mxCreateCharArray | mxGetNumberOfElements |
mxCreateCharMatrixFromStrings | mxGetNzmax |
mxCreateDoubleMatrix | mxGetProperty |
mxCreateLogicalArray | mxGetString |
mxCreateLogicalMatrix | mxMalloc |
mxCreateNumericArray | mxRealloc |
mxCreateNumericMatrix | mxSetCell |
mxCreateSparse | mxSetDimensions |
mxCreateSparseLogicalMatrix | mxSetField |
mxCreateStructArray | mxSetFieldByNumber |
mxCreateStructMatrix | mxSetIr |
mxGetCell | mxSetJc |
mxGetDimensions | mxSetM |
mxGetElementSize | mxSetN |
mxGetField | mxSetNzmax |
mxGetFieldByNumber | mxSetProperty |
mxGetIr |
Example
The example, arraySize.c
in
,
shows memory requirements of large matlabroot
/extern/examples/mexmxArray
s. To see the example,
open arraySize.c
in the MATLAB Editor.
This function requires one positive scalar numeric input, which it uses to create
a square matrix. It checks the size of the input to make sure that your system can
theoretically create a matrix of this size. If the input is valid, it displays the
size of the mxArray
in kilobytes.
Build this MEX file.
mex arraySize.c
Run the MEX file.
arraySize(2^10)
Dimensions: 1024 x 1024 Size of array in kilobytes: 1024
If your system does not have enough memory to create the array, MATLAB displays an Out of memory
error.
You can experiment with this function to test the performance and limits of handling large arrays on your system.
Caution Using Negative Values
When using the 64-bit API, mwSize
and
mwIndex
are equivalent to size_t
in
C/C++. This type is unsigned, unlike int
, which is the type used
in the 32-bit API. Be careful not to pass any negative values to functions that take
mwSize
or mwIndex
arguments. Do not
cast negative int
values to mwSize
or
mwIndex
; the returned value cannot be predicted. Instead,
change your code to avoid using negative values.
Building Cross-Platform Applications
If you develop programs that can run on both 32-bit and 64-bit architectures, pay
attention to the upper limit of values for mwSize
and
mwIndex
. The 32-bit application reads these values and
assigns them to variables declared as int
in C/C++. Be careful to
avoid assigning a large mwSize
or mwIndex
value to an int
or other variable that might be too small.