调用LAPACK和BLAS函数
您可以使用MEX文件调用LAPACK或BLAS函数。要创建MEX文件,您需要C/ c++或Fortran编程经验和软件资源(编译器和链接器)来构建可执行文件。它还有助于理解如何使用Fortran子例程。MATLAB®提供了mwlapack
而且mwblas
图书馆matlabroot
/外面的自由
.为了帮助您入门,在matlabroot
走读生/ / refbook例子
.
调用LAPACK或BLAS函数:
创建一个源MEX文件,包含
mexFunction
网关程序。确保您的平台有一个受支持的编译器。万博1manbetx有关支持的编译器的最新列表,请参见万博1manbetx万博1manbetx支持和兼容的编译器.
方法构建二进制MEX文件
墨西哥人
命令和单独的复杂构建标志-R2017b
.将源文件链接到其中一个或两个库,
mwlapack
而且mwblas
.的
mwlapack
而且mwblas
库仅支持64位整数作为矩阵维数万博1manbetx。请勿使用-compatibleArrayDims
选择。要构建包含使用复数函数的MEX文件,请参见将单独的复数传递给Fortran函数.
有关BLAS或LAPACK函数的信息,请参见https://www.netlib.org/blas/或https://www.netlib.org/lapack/.
构建matrixMultiply
使用BLAS函数的MEX函数
这个示例展示了如何构建示例MEX文件matrixMultiply.c
,它使用BLAS库中的函数。要使用此文件,请将其复制到本地文件夹。例如:
拷贝文件(fullfile (matlabroot,“外来的”,“例子”,“refbook”,“matrixMultiply.c”),“。”)
示例文件是只读文件。要修改一个例子,确保文件是可写的,输入:
fileattrib (“matrixMultiply.c”,' + w ')
要构建MEX文件,输入:
墨西哥人- v-R2017bmatrixMultiply.c-lmwblas
要运行MEX文件,输入:
A = [1 3 5;2 4 7];B = [-5 8 11;3 9 21;4 0 8];X =矩阵乘法(A,B)
X = 24 35 114 30 52 162
保留输入值以免修改
许多LAPACK和BLAS函数都会修改传递给它们的实参的值。在将实参传递给这些函数之前,制作一个可以修改的实参副本是一种很好的做法。有关MATLAB如何处理参数的信息mexFunction
,请参阅管理输入输出参数.
matrixDivide
例子
这个例子调用LAPACK函数dgesv
它修改它的输入参数。本例中的代码复制prhs [0]
而且prhs [1]
,并把副本传给dgesv
以保存输入参数的内容。
要查看示例,请打开matrixDivide.c
在MATLAB编辑器中。要创建MEX文件,请将源文件复制到可写文件夹中。
拷贝文件(fullfile (matlabroot,“外来的”,“例子”,“refbook”,“matrixDivide.c”),“。”)
要构建该文件,输入:
墨西哥人- v-R2017bmatrixDivide.c-lmwlapack
要进行测试,输入:
A = [1 2;3 4];B = [5;6);X = matrixDivide(A,B)
X = -4.0000 4.5000
从C/ c++程序向Fortran函数传递参数
LAPACK和BLAS函数是用Fortran编写的。C/ c++和Fortran在向函数传递参数和从函数传递参数时使用不同的约定。Fortran函数通过引用传递参数,而C/ c++函数通过值传递参数。当按值传递时,传递的是值的副本。当通过引用传递时,传递一个指向值的指针。引用也是值的地址。
当您调用Fortran子例程时,例如C/ c++程序中的LAPACK或BLAS函数,请确保通过引用传递参数。要通过引用传递,在实参前面加&号(&
),除非该论证已经是引用。例如,当您使用mxGetDoubles
函数中,创建对矩阵的引用,而不需要在参数前加上&号。
在下面的代码片段中,变量米
,n
,p
,一个
,零
需要&
让他们成为参考。变量一个
,B
,C
,中文
是指针,是引用。
/*指向输入输出矩阵的指针*/双*A, *B, *C;/*矩阵维数*/ mwSignedIndex m,n,p;/* dgemm */ char *chn = "N";双1 = 1.0,零= 0.0;/ *调用布拉斯特区函数* / dgemm(中文、中文、a&m, n,代替,一个,一个,a&m, B,拟定,零,C, a&m);
matrixMultiply
例子
的matrixMultiply.c
示例调用dgemm
,通过引用传递所有参数。要看源代码,打开matrixMultiply.c
在MATLAB编辑器中。要构建和运行此示例,请参见使用BLAS函数构建矩阵乘法MEX函数.
将参数从Fortran程序传递给Fortran函数
您可以从Fortran MEX文件调用LAPACK和BLAS函数。下面的示例采用两个矩阵,并通过调用BLAS例程将它们相乘dgemm
.要运行该示例,请将代码复制到编辑器中并命名该文件calldgemm。F
.
# include“fintrf.h”子例程mexFunction (nlhs、plhs nrhs, prhs) mwPointer plhs (*), prhs(*)整数nlhs nrhs mwPointer mxcreatedoublematrix mwPointer mxgetpr mwPointer A, B, C mwSize mxgetm, mxgetn mwSignedIndex m, n, p mwSize元素个数双精度,零,ar, br字符ch1 ch2 ch1 = ' n ' ch2 = ' n ' 1 = 1.0 0 = 0.0 = 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, 1, %val(A), m, + %val(B), p, 0, %val(C), m)返回结束
到BLAS库的链接,其中包含dgemm
函数。
墨西哥人- v-R2017bcalldgemm。F-lmwblas
修改函数名UNIX系统
在UNIX上调用LAPACK或BLAS函数时,在函数名后面添加下划线®系统。例如,调用dgemm
使用:
Dgemm_ (arg1, arg2,…, argn);
或者将这些行添加到源代码中:
#if !defined(_WIN32) #define dgemm dgemm_ #endif