Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Crear archivo Fortran Source MEX

Este ejemplo muestra cómo escribir un archivo MEX para llamar a una subrutina Fortran, en el uso de una matriz.timestwoMATLAB®MATLAB Puede ver el archivo de código fuente completo.Aquí En este ejemplo se utiliza el editor para escribir el código fuente y el comando para crear la función MEX.MATLABMATLABmex

La subrutina Fortrantimestwo

El código siguiente define la subrutina, que multiplica una matriz dimensional,, por, y devuelve los resultados en array,.timestwonx_input2y_output

      subroutine timestwo(y_output, x_input)       real*8 x_input, y_output        y_output = 2.0 * x_input       return       end

Crear archivo de código fuente

Abra el editor, cree un archivo y documente el archivo MEX con la siguiente información.MATLAB

C====================================================================== C     timestwo.f C     Computational function that takes a scalar and doubles it. C     This is a MEX file for MATLAB. C====================================================================== 

Agregue el archivo de encabezado Fortran, que contiene las declaraciones de la función de API.fintrf.hMATLAB

#include "fintrf.h" 

Guarde el archivo en la ruta de acceso, por ejemplo, en y asigne un nombre.MATLABc:\worktimestwo.F El nombre de su archivo MEX es.timestwo

Crear rutina de pasarela

utiliza la rutina de pasarela, como punto de entrada a una subrutina de Fortran.MATLABmexfunction Agregue el código siguiente.mexFunction

C     Gateway routine       subroutine mexFunction(nlhs, plhs, nrhs, prhs)  C     Declarations  C     Statements        return       end 

Agregue la siguiente instrucción a su subrutina para obligarlo a declarar todas las variables.mexfunction

implicit none

La declaración de tipo explícita es necesaria para las matrices de 64 bits.

Declare argumentosmexfunction

Para declarar variables, utilice el tipo,.mxArrayMATLABmwPointer Agregue este código después de la instrucción.Declarations

C     mexFunction arguments:       mwPointer plhs(*), prhs(*)       integer nlhs, nrhs 

Declare funciones y variables locales

  • Declare los nombres simbólicos y los tipos de funciones de API utilizadas en este archivo MEX.MATLAB

    C     Function declarations:       mwPointer mxGetDoubles       mwPointer mxCreateDoubleMatrix       integer mxIsNumeric       mwPointer mxGetM, mxGetN

    Para determinar el tipo de una función, consulte la documentación de referencia de la función de API.MATLAB Por ejemplo, consulte la documentación de.mxGetDoubles

  • Declare las variables locales para los argumentos.mexfunction

    C     Pointers to input/output mxArrays:       mwPointer x_ptr, y_ptr 
  • Declare las variables matriciales.

    C     Array information:       mwPointer mrows, ncols       mwSize size 

Verifique los argumentos de entrada y salida del archivo MEX

Compruebe el número de argumentos de entrada y salida de archivo MEX mediante los argumentos y.nrhsnlhs Agregue estas instrucciones al bloque de código.mexfunction

C     Check for proper number of arguments.        if(nrhs .ne. 1) then          call mexErrMsgIdAndTxt ('MATLAB:timestwo:nInput',      +                           'One input required.')       elseif(nlhs .gt. 1) then          call mexErrMsgIdAndTxt ('MATLAB:timestwo:nOutput',      +                           'Too many output arguments.')       endif 

Compruebe el tipo de argumento de entrada mediante el argumento.prhs

C     Check that the input is a number.       if(mxIsNumeric(prhs(1)) .eq. 0) then          call mexErrMsgIdAndTxt ('MATLAB:timestwo:NonNumeric',      +                           'Input must be a number.')       endif 

Crear rutina computacional

Agregue el código.timestwo Esta subrutina es su rutina computacional, el código fuente que realiza la funcionalidad que desea usar.MATLAB

C     Computational routine        subroutine timestwo(y_output, x_input)       real*8 x_input, y_output        y_output = 2.0 * x_input       return       end 

Una rutina computacional es opcional. Alternativamente, puede colocar el código dentro del bloque de función.mexfunction

Declare variables para la rutina computacional

Coloque las siguientes declaraciones de variable en.mexFunction

C     Arguments for computational routine:       real*8  x_input, y_output

Leer matriz de entrada

Para apuntar a los datos de la matriz de entrada, utilice la función.mxGetDoubles

x_ptr = mxGetDoubles(prhs(1))

Para crear una matriz Fortran, utilice la función.x_inputmxCopyPtrToReal8

C     Get the size of the input array.       mrows = mxGetM(prhs(1))       ncols = mxGetN(prhs(1))       size = mrows*ncols  C     Create Fortran array from the input argument.       call mxCopyPtrToReal8(x_ptr,x_input,size) 

Preparar datos de salida

Para crear el argumento de salida, utilice la función.plhs(1)mxCreateDoubleMatrix

C     Create matrix for the return argument.       plhs(1) = mxCreateDoubleMatrix(mrows,ncols,0) 

Utilice la función a la que asignar el argumento.mxGetDoublesy_ptrplhs(1)

      y_ptr = mxGetDoubles(plhs(1))

Realice el cálculo

Pase los argumentos a.timestwo

C     Call the computational subroutine.       call timestwo(y_output, x_input) 

Copiar resultados en el argumento de salida

C     Load the data into y_ptr, which is the output to MATLAB.       call mxCopyReal8ToPtr(y_output,y_ptr,size)      

Ver archivo de código fuente completo

Compare su archivo de origen con, ubicado en eltimestwo.F matlabroot/extern/examples/refbook Carpeta. en el editor.Abra el archivo

Construir archivo MEX binario

En el símbolo del sistema, compile el archivo MEX binario.MATLAB

mex -R2018a timestwo.F

Pruebe el archivo MEX

x = 99; y = timestwo(x)
y =    198 

Consulte también

| | | | | | |

Temas relacionados