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.

Llame a las funciones LAPACK y BLAS

Puede llamar a una función LAPACK o BLAS utilizando un archivo MEX. Para crear un archivo MEX, necesita la experiencia de programación de C/C++ o Fortran y los recursos de software (compiladores y linkers) para compilar un archivo ejecutable. También es útil entender cómo utilizar subrutinas Fortran. proporciona las bibliotecas y enMATLAB®mwlapackmwblas matlabroot./extern/lib Para ayudarle a empezar, hay ejemplos de código fuente en matlabroot./extern/examples/refbook

Para llamar a las funciones LAPACK o BLAS:

  1. Cree un archivo MEX de origen que contenga la rutina de pasarela.mexFunction

  2. Asegúrese de que tiene un compilador admitido para su plataforma. Para obtener una lista actualizada de los compiladores admitidos, consulte.Los compiladores compatibles y compatibles

  3. Crear un archivo MEX binario mediante el comando y la marca de compilación compleja independiente.mex-R2017b

    • Vincule el archivo de origen a una o ambas bibliotecas y.mwlapackmwblas

    • Las bibliotecas y solo admiten enteros de 64 bits para las dimensiones de matriz.mwlapackmwblas No utilice la opción.-compatibleArrayDims

    • Para crear un archivo MEX con funciones que utilizan números complejos, consulte.Pase números complejos separados a funciones de Fortran

Construir función MEX utilizando las funciones BLASmatrixMultiply

En este ejemplo se muestra cómo crear el archivo MEX de ejemplo, que utiliza funciones de la biblioteca BLAS.matrixMultiply.c Para trabajar con este archivo, cópielo en una carpeta local. Por ejemplo:

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

Los archivos de ejemplo son archivos de solo lectura. Para modificar un ejemplo, asegúrese de que el archivo se podría escribir escribiendo:

fileattrib('matrixMultiply.c','+w')

Para compilar el archivo MEX, escriba:

mex -v -R2017b matrixMultiply.c -lmwblas

Para ejecutar el archivo MEX, escriba:

A = [1 3 5; 2 4 7]; B = [-5 8 11; 3 9 21; 4 0 8]; X = matrixMultiply(A,B)
X =     24    35   114     30    52   162 

Conservar valores de entrada de modificación

Muchas funciones LAPACK y BLAS modifican los valores de los argumentos que se les pasan. Es una buena práctica hacer una copia de los argumentos que puede modificar antes de pasarlos a estas funciones. Para obtener información acerca de cómo controla los argumentos a la, vea.MATLABmexFunctionAdministración de parámetros de entrada y salida

EjemplomatrixDivide

En este ejemplo se llama a la función LAPACK que modifica sus argumentos de entrada.dgesv El código de este ejemplo realiza copias de y, y pasa las copias para conservar el contenido de los argumentos de entrada.prhs[0]prhs[1]dgesv

Para ver el ejemplo, abra matrixDivide.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','matrixDivide.c'),'.') 

Para compilar el archivo, escriba:

mex -v -R2017b matrixDivide.c -lmwlapack

Para probar, escriba:

A = [1 2; 3 4]; B = [5; 6]; X = matrixDivide(A,B)
X =    -4.0000     4.5000 

Pasar argumentos a funciones de Fortran desde programas de C/C++

Las funciones LAPACK y BLAS están escritas en Fortran. C/C++ y Fortran usan convenciones diferentes para pasar argumentos a y desde funciones. Las funciones de Fortran pasan argumentos por referencia, mientras que las funciones de C/C++ pasan argumentos por valor. Cuando se pasa por valor, se pasa una copia del valor. Cuando se pasa por referencia, se pasa un puntero al valor. Una referencia es también la dirección del valor.

Cuando se llama a una subrutina de Fortran, como una función de LAPACK o BLAS, desde un programa de C/C++, asegúrese de pasar los argumentos por referencia. Para pasar por referencia, preceda el argumento con un signo ampersand (), a menos que ese argumento ya sea una referencia.& Por ejemplo, cuando se crea una matriz mediante la función, se crea una referencia a la matriz y no es necesario el signo ampersand antes del argumento.mxGetDoubles

En el siguiente fragmento de código, las variables,,, y necesita el carácter para hacerlos una referencia.mnponezero& Variables,, y son punteros, que son referencias.ABCchn

/* pointers to input & output matrices*/ double *A, *B, *C; /* matrix dimensions */ mwSignedIndex m,n,p; /* other inputs to dgemm */ char *chn = "N"; double one = 1.0, zero = 0.0;  /* call BLAS function */ dgemm(chn, chn, &m, &n, &p, &one, A, &m, B, &p, &zero, C, &m); 

EjemplomatrixMultiply

El ejemplo llama, pasando todos los argumentos por referencia.matrixMultiply.cdgemm Para ver el código fuente, abra matrixMultiply.c en el editor.MATLAB Para compilar y ejecutar este ejemplo, vea.Construir función MEX utilizando las funciones BLASmatrixMultiply

Pasar argumentos a funciones Fortran de programas FORTRAN

Puede llamar a funciones LAPACK y BLAS de archivos MEX Fortran. El ejemplo siguiente toma dos matrices y las multiplica llamando a la rutina BLAS.dgemm Para ejecutar el ejemplo, copie el código en el editor y asigne un nombre al archivo.calldgemm.F

#include "fintrf.h"        subroutine mexFunction(nlhs, plhs, nrhs, prhs)       mwPointer plhs(*), prhs(*)       integer nlhs, nrhs       mwPointer mxcreatedoublematrix       mwPointer mxgetpr       mwPointer A, B, C       mwSize mxgetm, mxgetn       mwSignedIndex m, n, p       mwSize numel       double precision one, zero, ar, br       character ch1, ch2              ch1 = 'N'       ch2 = 'N'       one = 1.0       zero = 0.0              A = mxgetpr(prhs(1))       B = mxgetpr(prhs(2))       m = mxgetm(prhs(1))       p = mxgetn(prhs(1))       n = mxgetn(prhs(2))              plhs(1) = mxcreatedoublematrix(m, n, 0.0)       C = mxgetpr(plhs(1))       numel = 1       call mxcopyptrtoreal8(A, ar, numel)       call mxcopyptrtoreal8(B, br, numel)              call dgemm(ch1, ch2, m, n, p, one, %val(A), m,      +           %val(B), p, zero, %val(C), m)              return       end 

Enlace a la librería BLAS, que contiene la función.dgemm

mex -v -R2017b calldgemm.F -lmwblas

Modifique el nombre de función en sistemasUNIX

Añada un carácter de subrayado siguiendo el nombre de la función cuando llame a las funciones LAPACK o BLAS en un sistema.UNIX® Por ejemplo, para llamar, utilice:dgemm

dgemm_(arg1, arg2, ..., argn);

O agregue estas líneas al código fuente:

#if !defined(_WIN32) #define dgemm dgemm_ #endif