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
