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.

Pase números complejos separados a funciones de Fortran

almacena números complejos de la misma manera que Fortran, en un vector, con las partes reales e imaginarias intercaladas.MATLAB®pa

Antes de la versión 9,4 (R2018a), almacenaba números complejos de forma diferente a Fortran, en vectores de longitud iguales y.MATLABMATLABprpi Como resultado, las variables complejas intercambiadas entre esas versiones y una función Fortran son incompatibles. proporciona rutinas de conversión de ejemplo y que cambian el formato de almacenamiento de números complejos para solucionar esta incompatibilidad.MATLABMATLABmat2fortfort2mat el fort.h archivo de encabezado define las funciones y.mat2fortfort2mat El código fuente está en el fort.c Archivo.

  • — Convierta una matriz compleja separada en un almacenamiento complejo de Fortran.mat2fortMATLAB

  • — Convertir el almacenamiento complejo Fortran en partes reales e imaginarias separadas.fort2matMATLAB

Para utilizar estas rutinas:

  1. Incluya el archivo de encabezado en el archivo de origen, utilizando la instrucción.fort.h#include "fort.h"

  2. Vincule el archivo con el programa.fort.c Especifique la ruta completa, matlabrooten el comando Build./extern/examples/refbookfort.c

  3. Para indicar el archivo de cabecera, utilice el -Ipathname Interruptor. Especifique la ruta completa, matlabrooten el comando Build./extern/examples/refbookfort.h

  4. Cuando especifique la ruta de acceso completa, reemplace el término matlabroot con el nombre de la carpeta real.

  5. Compile la función con la opción.mex-R2017b

Manejo de valores de entrada de número complejo

No es necesario copiar argumentos para funciones que utilizan valores de entrada de número complejo. La rutina de conversión crea una copia de los argumentos por usted.mat2fort Para obtener información, consulte.Conservar valores de entrada de modificación

Manejo de argumentos de salida de número complejo

Para las variables complejas devueltas por una función Fortran, haga lo siguiente:

  1. Al asignar almacenamiento para la variable, asigne una variable real con el doble de espacio que lo haría para una variable del mismo tamaño. Haga esto porque la variable devuelta utiliza el formato Fortran, que toma el doble de espacio. Vea la asignación de en el ejemplo.zout

  2. Para que la variable sea compatible, utilice la función.MATLABfort2mat

Pasar variables complejas —matrixDivideComplex

Este ejemplo muestra cómo llamar a una función, pasando complejo como entrada y recepción complejo como salida.prhs[0]plhs[0] Variables temporales y contienen los valores de entrada y salida en formato Fortran.zinzout Para ver el ejemplo, abra matrixDivideComplex.c en el editor.MATLAB Para crear el archivo MEX, copie el archivo de origen en una carpeta de escritura.

copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivideComplex.c'),'.') 

Crea variables localizando el archivo y su archivo de cabecera.fort.c

fortfile = fullfile(matlabroot,'extern','examples','refbook','fort.c'); fortheaderdir = fullfile(matlabroot,'extern','examples','refbook');

Construya la función MEX.

mex('-v','-R2017b',['-I' fortheaderdir],'matrixDivideComplex.c',fortfile,'-lmwlapack') 

Pruebe la función.

Areal = [1 2; 3 4]; Aimag = [1 1; 0 0]; Breal = [5; 6]; Bimag = [0; 0]; Acomplex = complex(Areal,Aimag); Bcomplex = complex(Breal,Bimag); X = matrixDivideComplex(Acomplex,Bcomplex) 
X =   -4.4000 + 0.8000i    4.8000 - 0.6000i 

Manejar el tipo de retorno complejo Fortran —dotProductComplex

Algunas funciones BLAS de nivel 1 (por ejemplo, y) devuelven un tipo, que el lenguaje C no admite.zdotuzdotcdouble complex El siguiente archivo MEX de C,, muestra cómo controlar el tipo de valor devuelto complejo Fortran para la función.dotProductComplex.czdotu Para ver el ejemplo, abra dotProductComplex.c en el editor.MATLAB

La sintaxis de llamada para un programa de C que llama a una función Fortran que devuelve un valor en un argumento de salida depende de la plataforma. En el yWindows® Mac plataformas, pase el valor devuelto como primer argumento de entrada. proporciona una macro, para controlar estas diferencias.MATLABFORTRAN_COMPLEX_FUNCTIONS_RETURN_VOID

En el ejemplo se calcula el producto de punto de cada elemento de dos vectores complejos y.dotProductComplexXAB La sintaxis de llamada es:

X = dotProductComplex(A,B)

donde y son vectores complejos del mismo tamaño y es un escalar complejo.ABX

Por ejemplo, para compilar:

copyfile(fullfile(matlabroot,'extern','examples','refbook','dotProductComplex.c'),'.') fortfile = fullfile(matlabroot,'extern','examples','refbook','fort.c'); fortheaderdir = fullfile(matlabroot,'extern','examples','refbook'); mex('-v','-R2017b',['-I' fortheaderdir],'dotProductComplex.c',fortfile,'-lmwblas')

Para probar, escriba;

a1 = [1+2i; 2+3i]; b1 = [-1+2i; -1+3i]; X = dotProductComplex(a1,b1)
X =   -16.0000 + 3.0000i 

Factorización indefinida simétrica usando LAPACK —utdu_slv

El ejemplo llama a funciones LAPACK y.utdu_slv.czhesvxdsysvx Para ver el ejemplo, abra utdu_slv.c en el editor.MATLAB Para crear el archivo MEX, copie el archivo de origen en una carpeta de escritura.

copyfile(fullfile(matlabroot,'extern','examples','refbook','utdu_slv.c'),'.') 

Para construir:

fortheaderdir = fullfile(matlabroot,'extern','examples','refbook'); mex('-v','-R2017b',['-I' fortheaderdir],'utdu_slv.c',fortfile,'-lmwlapack')