主要内容

调用LAPACK和BLAS函数

您可以使用MEX文件调用LAPACK或BLAS函数。要创建MEX文件,您需要C/ c++或Fortran编程经验和软件资源(编译器和连接器)来构建可执行文件。了解如何使用Fortran子例程也很有帮助。MATLAB®提供mwlapackmwblas图书馆草根/外部/库.为了帮助您开始,有源代码示例草根走读生/ / refbook例子

调用LAPACK或BLAS函数:

  1. 创建包含的源MEX文件MEX函数网关例程。

  2. 确保您的平台有一个受支持的编译器。金宝app有关受支持编译器的最新列表,请参阅金宝app金宝app支持的和兼容的编译器

  3. 使用。构建一个二进制MEX文件墨西哥命令和单独的复杂构建标志-R2017b

    • 将您的源文件链接到其中一个或两个库,mwlapackmwblas

    • mwlapackmwblas库仅支持矩阵维度的64位整数。金宝app不要使用-compatibleArrayDims选项

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

  4. 有关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

从C/ c++程序中传递参数给Fortran函数

LAPACK和BLAS函数是用Fortran编写的。C/ c++和Fortran在向函数传递参数和向函数传递参数时使用了不同的约定。Fortran函数通过引用传递参数,而C/ c++函数通过值传递参数。传递值时,传递的是值的副本。当通过引用传递时,传递的是指向该值的指针。引用也是值的地址。

当您从C/ c++程序调用Fortran子例程时,例如从LAPACK或BLAS调用函数,请确保通过引用传递参数。要通过引用传递,在参数前面加上&号(),除非该参数已经是引用mxGetDoubles函数,则创建对矩阵的引用,而不需要在参数之前使用符号and。

在下面的代码段中,变量np一个需要字符使其成为引用。变量一个BC中文是指针,它们是引用。

/*指向输入和输出矩阵的指针*/ 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程序向Fortran函数传递参数

您可以从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系统

在UNIX上调用LAPACK或BLAS函数时,在函数名后面添加下划线®系统。例如,打电话dgemm使用:

dgemm_(arg1,arg2,…,argn);

或者在源代码中添加以下行:

#define dgemm (_WIN32) #define dgemm_ #endif . define dgemm_ #endif . define

外部网站