matlab帮助文档里有详细文档Call Functions in shared Libaries
什么是共享库
共享库是一组函数的集合,在程序运行期间可以动态加载。共享库中的函数可以用不同的语言实现,但只要这些函数提供了C语言接口,那Matlab就支持该共享库,而且Matlab支持在不同平台下链接共享库。
| 平台
|
共享库 | 文件扩展名 |
| Micsoft Windows | 动态链接库文件 | .dll |
| UNIX and Linus | 共享目标文件 | .so |
| Apple Macintosh | 动态共享文件 | .dylib |
共享库必须要提供一个头文件,用来声明共享库中的函数。函数签名中明确了函数的名称,参数的个数和类型。
你还需要一个已安装好的matlab支持的C编译器。
matlab可以通过命令行接口调用外部共享库中的函数。这个接口允许你将一个外部共享库加载到Matlab内存中,并调用共享库中的函数。虽然matlab语言和C语言差异较大,但是通常你可以直接传递一个类型到C函数中,不需要做转换,因为matlab在后面已经帮你做好了这部分工作。
当你使用完了共享库,有个重点是你需要卸载共享库以释放内存。
加载和卸载共享库
为了让matlab调用共享库中的函数,首先需要将共享库加载到内存中去,加载完之后,你可以获取库中的函数信息和直接在matlab中调用这些函数,当不再需要共享库时,还需要卸载共享库来维持内存使用情况。
加载共享库到matlab中,使用loadlibray函数,函数语法是:
loadlibrary('shrlib','hfile')
其中shrlib表示共享库文件的名称,hfile表示包含函数声明的头文件名称。
用unloadlibrary命令去卸载共享库并释放内存。命令语法:
unloadlibrary libname
其中libname表示共享库名称。
查看共享库函数
在命令行窗口中查看函数
为了在命令行窗口中显示共享库中的函数信息,可以用libfunctions,例如,查看libmx共享库中有哪些可用的函数,可以输入如下命令:
if not(libisloaded('libmx')) hfile = [matlabroot '\extern\include\matrix.h']; loadlibrary('libmx',hfile) end libfunctions libmx
matlab命令行窗口中显示:
MATLAB displays (in part): Functions in library libmx: mxAddField mxGetScalar mxArrayToString mxGetString_730 mxCalcSingleSubscript_730 mxGetUserBits mxCalloc mxIsCell mxCreateCellArray_730 mxIsChar mxCreateCellMatrix_730 mxIsClass . . . . . .
如果想看具体的函数签名,在命令后加-full指令,这个选项能够显示matlab调用共享库中函数的语法,其中函数用的参数列表和返回类型均为matlab类型,而不是C版本的类型。可输入如下命令:
list = libfunctions('libmx','-full')
matlab显示(部分):
MATLAB displays (in part): list = '[int32, MATLAB array, cstring] mxAddField(MATLAB array, cstring)' '[cstring, MATLAB array] mxArrayToString(MATLAB array)' '[uint64, MATLAB array, uint64Ptr] mxCalcSingleSubscript_730( MATLAB array, uint64, uint64Ptr)' 'lib.pointer mxCalloc(uint64, uint64)' '[MATLAB array, uint64Ptr] mxCreateCellArray_730(uint64, uint64Ptr)' 'MATLAB array mxCreateCellMatrix_730(uint64, uint64)' . . .
在窗口中查看函数
为了得到共享库中的函数信息,还可以用libfunctionview函数,matlab将会打开一个窗口显示如下信息:
| Heading | 描述 |
| Return Type | 函数返回类型 |
| Name | 函数名称 |
| Arguments | 输入参数的有效类型 |
查看libmx共享库中的函数信息,可以输入如下命令:
if not(libisloaded('libmx')) hfile = [matlabroot '\extern\include\matrix.h']; loadlibrary('libmx',hfile) end libfunctionsview libmx
matlab会弹出如下窗口:

需要注意的是,上述的参数类型和函数返回类型均为matlab类型,不是C版本类型。
调用共享库中函数
当加载完共享库后,可以用calllib函数来调用共享库中的函数了,函数语法为:
calllib('libname','funcname',arg1,...,argN)
指定共享库名称,函数名称,如果有要求的话,还包括所有传递到函数中参数。下面的实例可以调用libmx库中的函数。首选加载共享库:
if not(libisloaded('libmx')) hfile = [matlabroot '\extern\include\matrix.h']; loadlibrary('libmx',hfile) end
创建一个数组y:
y = rand(4,7,2);
调用共享库中的函数,获取数组y的信息:
calllib('libmx','mxGetNumberOfElements',y)
matlab显示数组的个数:
ans =
56
调用共享库中的函数,获取数组y的信息:
calllib('libmx','mxGetClassID',y)
matlab显示数组的类型:
ans =
mxDOUBLE_CLASS
