主要内容

调用LAPACK和BLAS函数

您可以使用MEX文件调用LAPACK或BLAS函数。要创建MEX文件,您需要C/ c++或Fortran编程经验和软件资源(编译器和链接器)来构建可执行文件。它还有助于理解如何使用Fortran子例程。MATLAB®提供了mwlapack而且mwblas图书馆matlabroot/外面的自由.为了帮助您入门,在matlabroot走读生/ / refbook例子

调用LAPACK或BLAS函数:

  1. 创建一个源MEX文件,包含mexFunction网关程序。

  2. 确保您的平台有一个受支持的编译器。万博1manbetx有关支持的编译器的最新列表,请参见万博1manbetx万博1manbetx支持和兼容的编译器

  3. 方法构建二进制MEX文件墨西哥人命令和单独的复杂构建标志-R2017b

    • 将源文件链接到其中一个或两个库,mwlapack而且mwblas

    • mwlapack而且mwblas库仅支持64位整数作为矩阵维数万博1manbetx。请勿使用-compatibleArrayDims选择。

    • 要构建包含使用复数函数的MEX文件,请参见将单独的复数传递给Fortran函数

  4. 有关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函数中,创建对矩阵的引用,而不需要在参数前加上&号。

在下面的代码片段中,变量np一个,需要让他们成为参考。变量一个BC,中文是指针,是引用。

/*指向输入输出矩阵的指针*/双*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

外部网站