您可以使用MEX文件调用LAPACK或BLAS函数。要创建MEX文件,您需要C/ c++或Fortran编程经验和软件资源(编译器和连接器)来构建可执行文件。了解如何使用Fortran子例程也很有帮助。MATLAB®提供mwlapack
和mwblas
图书馆草根
/外部/库
.为了帮助您开始,有源代码示例草根
走读生/ / refbook例子
.
调用LAPACK或BLAS函数:
创建包含的源MEX文件MEX函数
网关例程。
确保您的平台有一个受支持的编译器。金宝app有关受支持编译器的最新列表,请参阅金宝app金宝app支持的和兼容的编译器.
使用。构建一个二进制MEX文件墨西哥
命令和单独的复杂构建标志-R2017b
.
将您的源文件链接到其中一个或两个库,mwlapack
和mwblas
.
的mwlapack
和mwblas
库仅支持矩阵维度的64位整数。金宝app不要使用-compatibleArrayDims
选项
要使用使用复数的函数构建MEX文件,请参见将单独的复数传递给Fortran函数.
有关BLAS或LAPACK函数的信息,请参阅https://www.netlib.org/blas/或https://www.netlib.org/lapack/.
矩阵乘法
使用BLAS函数的MEX函数这个示例展示了如何构建示例MEX文件matrixMultiply.c
,它使用BLAS库中的函数。要使用此文件,请将其复制到本地文件夹。例如:
拷贝文件(fullfile (matlabroot,“外人”,“例子”,“参考书”,“matrixMultiply.c”),“。”)
示例文件是只读文件。修改示例,确保文件可写,输入:
fileattrib (“matrixMultiply.c”,' + w ')
要构建MEX文件,输入:
墨西哥-五-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如何处理MEX函数
,请参阅管理输入和输出参数.
母体病毒
例子此示例调用LAPACK函数dgesv
修改其输入参数的。本例中的代码复制了prhs [0]
和prhs [1]
,并将副本传递给dgesv
保存输入参数的内容。
要查看示例,请打开matrixDivide.c
在MATLAB编辑器中。要创建MEX文件,请将源文件复制到一个可写文件夹。
拷贝文件(fullfile (matlabroot,“外人”,“例子”,“参考书”,“matrixDivide.c”),“。”)
要构建该文件,输入:
墨西哥-五-R2017bmatrixDivide.c-拉帕克
要进行测试,请键入:
A=[12;34];B=[5;6];X=matrixDivide(A,B)
X = -4.0000
LAPACK和BLAS函数是用Fortran编写的。C/ c++和Fortran在向函数传递参数和向函数传递参数时使用了不同的约定。Fortran函数通过引用传递参数,而C/ c++函数通过值传递参数。传递值时,传递的是值的副本。当通过引用传递时,传递的是指向该值的指针。引用也是值的地址。
当您从C/ c++程序调用Fortran子例程时,例如从LAPACK或BLAS调用函数,请确保通过引用传递参数。要通过引用传递,在参数前面加上&号(&
),除非该参数已经是引用mxGetDoubles
函数,则创建对矩阵的引用,而不需要在参数之前使用符号and。
在下面的代码段中,变量米
,n
,p
,一个
和零
需要&
字符使其成为引用。变量一个
,B
,C
和中文
是指针,它们是引用。
/*指向输入和输出矩阵的指针*/ double *A, *B, *C;/*矩阵维数*/ mwSignedIndex m,n,p;/*其他输入到dgemm */ char *chn = "N";双一= 1.0,零= 0.0;/ *调用布拉斯特区函数* / dgemm(中文、中文、a&m, n,代替,一个,一个,a&m, B,拟定,零,C, a&m);
矩阵乘法
例子的matrixMultiply.c
示例调用dgemm
,通过引用传递所有参数。要查看源代码,请打开matrixMultiply.c
在MATLAB编辑器中。要构建并运行此示例,请参见使用BLAS函数构建matrixMultiply MEX函数.
您可以从Fortran MEX文件中调用LAPACK和BLAS函数。下面的示例使用两个矩阵并通过调用BLAS例程将它们相乘dgemm
.要运行示例,请将代码复制到编辑器中并命名文件calldgemm。F
.
#包括“fintrf.h”子例程MEX函数(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 numel双精度一、零、ar、br字符ch1、ch2 ch1='n'ch2 ch2 ch2='n'one=1.0=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调用mxcopyptrtorreal8(A,ar,numel)调用mxcopyptrtorreal8(B,br,numel)调用dgemm(ch1,ch2,m,n,p,one,%val(A),m,+%val(B),p,%val(C),m)返回结束
链接到BLAS库,其中包含dgemm
函数。
墨西哥-五-R2017bcalldgemm。F-lmwblas
在UNIX上调用LAPACK或BLAS函数时,在函数名后面添加下划线®系统。例如,打电话dgemm
使用:
dgemm_(arg1,arg2,…,argn);
或者在源代码中添加以下行:
#define dgemm (_WIN32) #define dgemm_ #endif . define dgemm_ #endif . define