El comando utiliza la opción de forma predeterminada.mex
-largeArrayDims
En este tema se describe cómo actualizar los archivos MEX para usar la API de 64 bits.
Puede seguir utilizando la API de 32 bits llamando al comando con la opción.mex
-compatibleArrayDims
Sin embargo, para obtener más información sobre el uso de esta opción, consulte.¿Qué pasa si no actualizo?
Para revisar y actualizar el código fuente del archivo MEX, utilice la siguiente lista de comprobación.
Prepare el código antes de editarlo: consulte.Copia de respaldo de archivos y crear pruebas
Cambiar y probar el código de forma iterativa.
Antes de compilar los archivos MEX con la API de 64 bits, refactoriza el código existente comprobando las siguientes condiciones:
Después de cada cambio, compile y pruebe el código:
Compile con la API de 32 bits. Por ejemplo, para compilar, escriba:myMexFile.c
mex -compatibleArrayDims myMexFile.c
Prueba después de cada refactorización — ver.Probar, depurar y resolver diferencias después de cada iteración de refactorización
Compile con la API de 64 bits. Para compilar, escriba:myMexFile.c
mex myMexFile.c
Resolver errores y advertencias: consulte.Resolver errores y advertencias de compilación-largeArrayDims
Comparar resultados — ver.Ejecute el archivo MEX de 64 bits y compare los resultados con la versión de 32 bits
Comprobar la memoria — ver.Experimente con matrices grandes
Los procedimientos siguientes utilizan la terminología de C/C++ y el código de ejemplo. Fortran archivos MEX comparten problemas, con más tareas descritas en.Pasos adicionales para actualizar el código fuente de Fortran
Antes de modificar el código, compruebe que el archivo MEX funciona con la API de 32 bits. Como mínimo, compile una lista de entradas y salidas esperadas, o cree un conjunto de pruebas completo. Utilice estas pruebas para comparar los resultados con el código fuente actualizado. Los resultados deben ser idénticos.
Copia de respaldo de todos los archivos de origen, binarios y de prueba.
Para manejar matrices grandes, convierta variables que contengan índices de matriz o tamaños para usar los tipos y en lugar del tipo de 32 bits.mwSize
mwIndex
int
Revise el código para ver si contiene los siguientes tipos de variables:
Variables utilizadas directamente por las funciones de Matrix API — ver.Actualizar argumentos usados para llamar a funciones en la API de 64 bits
Variables intermedias — ver.Actualizar variables utilizadas para los índices y tamaños de matrices
Variables utilizadas como valores de tamaño/índice y como enteros de 32 bits-ver.Analizar otras variables
Identifique las funciones de API de 64 bits en el código que usan los tipos/.mwSize
mwIndex
Para ver la lista de funciones, consulte.Con la API de 64 bits Busque las variables que utiliza para llamar a las funciones. Compruebe la firma de la función, mostrada debajo del encabezado en la documentación de referencia de función.Syntax La firma identifica las variables que toman/valora como valores de entrada o salida.mwSize
mwIndex
Cambie las variables para usar el tipo correcto.
Por ejemplo, supongamos que el código usa la función, como se muestra en las siguientes instrucciones:mxCreateDoubleMatrix
int nrows,ncolumns; ... y_out = mxCreateDoubleMatrix(nrows, ncolumns, mxREAL);
Para ver la firma de la función, escriba:
doc mxCreateDoubleMatrix
La firma es:
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag)
El tipo de argumentos de entrada y es.m
n
mwSize
Cambie el código como se muestra en la tabla.
Reemplazar: | Con: |
---|---|
int nrows,ncolumns; |
mwSize nrows,ncolumns; |
Si el código utiliza variables intermedias para calcular el tamaño y los valores de índice, utilice/para estas variables.mwSize
mwIndex
Por ejemplo, el código siguiente declara las entradas como tipo:mxCreateDoubleMatrix
mwSize
mwSize nrows,ncolumns; /* inputs to mxCreateDoubleMatrix */ int numDataPoints; nrows = 3; numDataPoints = nrows * 2; ncolumns = numDataPoints + 1; ... y_out = mxCreateDoubleMatrix(nrows, ncolumns, mxREAL);
En este ejemplo se utiliza la variable intermedia (de tipo) para calcular el valor de.numDataPointsint
ncolumns Si copia un valor de 64 bits de la variable de 32 bits, el valor resultante trunca.nrowsnumDataPoints Su archivo MEX podría bloquearse o producir resultados incorrectos. Utilice el tipo para, como se muestra en la tabla siguiente.mwSize
numDataPoints
Reemplazar: | Con: |
---|---|
int numDataPoints; |
mwSize numDataPoints; |
No es necesario cambiar todas las variables de enteros en el código. Por ejemplo, los números de campo de las estructuras y los códigos de estado son de tipo.int
Sin embargo, es necesario identificar las variables utilizadas para varios propósitos y, si es necesario, reemplazarlas por varias variables.
En el ejemplo siguiente se crea una matriz, y una estructura, en función del número de sensores.myNumericmyStruct El código utiliza una variable, tanto para el tamaño de la matriz como para el número de campos de la estructura.numSensors
mxArray *myNumeric, *myStruct; int numSensors; mwSize m, n; char **fieldnames; ... myNumeric = mxCreateDoubleMatrix(numSensors, n, mxREAL); myStruct = mxCreateStructMatrix(m, n, numSensors, fieldnames);
Las firmas de función para y son:mxCreateDoubleMatrix
mxCreateStructMatrix
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag) mxArray *mxCreateStructMatrix(mwSize m, mwSize n, int nfields, const char **fieldnames);
Para la función, el código utiliza para la variable.mxCreateDoubleMatrix
numSensorsm El tipo de es.mmwSize
Para la función, el código utiliza para la variable.mxCreateStructMatrix
numSensorsnfields El tipo de es.nfieldsint
Reemplace con dos nuevas variables para controlar ambas funciones, como se muestra en la tabla siguiente.numSensors
Reemplazar: | Con: |
---|---|
int numSensors; |
/* create 2 variables */ /* of different types */ mwSize numSensorSize; int numSensorFields; |
myNumeric = mxCreateDoubleMatrix( numSensors, n, mxREAL); |
/* use mwSize variable */ /* numSensorSize */ myNumeric = mxCreateDoubleMatrix( numSensorSize, n, mxREAL); |
myStruct = mxCreateStructMatrix( m, n, numSensors, fieldnames); |
/* use int variable */ /* numSensorFields */ myStruct = mxCreateStructMatrix( m, n, numSensorFields, fieldnames); |
Al actualizar archivos MEX más antiguos, puede encontrar llamadas a funciones no admitidas, como, o. se eliminó la compatibilidad con estas funciones en la versión 7,1 (R14SP3).mxCreateFull
mxGetName
mxIsString
MATLAB® No se pueden utilizar funciones no admitidas con dimensiones de matriz de 64 bits. Para ver la lista de funciones no admitidas y los reemplazos recomendados, consulte.
Actualice el código para usar una función equivalente, si está disponible. Por ejemplo, use en lugar de.mxCreateDoubleMatrix
mxCreateFull
Para compilar con la API de 32 bits, escriba:myMexFile.c
mex -compatibleArrayDims myMexFile.c
Utilice las pruebas que creó al principio de este proceso para comparar los resultados de su archivo MEX actualizado con su archivo binario original. Ambos archivos MEX deben devolver resultados idénticos. Si no, depure y resuelva las diferencias. Las diferencias son más fáciles de resolver ahora que cuando se compila con la API de 64 bits.
-largeArrayDims
Después de revisar y actualizar el código, compile el archivo MEX con la API de control de matrices grandes. Para compilar con la API de 64 bits, escriba:myMexFile.c
mex myMexFile.c
Dado que los tipos son tipos, el compilador a veces se refiere a ellos como, o por otros nombres similares.mwSize
mwIndex
MATLABsize_t
unsigned_int64
La mayoría de los problemas de compilación están relacionados con las discrepancias de tipo entre los tipos de 32 bits y 64 bits. Consulte el paso 5 para identificar problemas de compilación comunes para compiladores específicos y posibles soluciones.¿Cómo actualizo los archivos MEX para usar la API de manejo de matrices grandes (-largeArrayDims)?
Compare los resultados de la ejecución de su archivo MEX compilado con la API de 64 bits con los resultados de su binario original. Si hay diferencias o errores, utilice un depurador para investigar la causa. Para obtener información sobre las capacidades del depurador, consulte la documentación del compilador.
Para identificar problemas, y posibles soluciones, puede que se encuentre al ejecutar sus archivos MEX, consulte el paso 6 en.¿Cómo actualizo los archivos MEX para usar la API de manejo de matrices grandes (-largeArrayDims)?
Después de resolver los problemas y actualizar el archivo MEX, replica la funcionalidad del código original mientras se usa la API de control de matriz grande.
Si tiene acceso a una máquina con grandes cantidades de memoria, puede experimentar con matrices grandes. Una matriz de números de punto flotante de precisión doble (el valor predeterminado en) con 2MATLAB32 elementos toma aproximadamente 32 GB de memoria.
Para obtener un ejemplo que muestra el uso de matrices grandes, vea el archivo MEX en.arraySize.c
Manipulación de grandesmxArrays