標籤:

MATLAB 配置 MEX 編譯環境

MATLAB 可以調用由 C/C++ 或 FORTRAN 語言文件編譯生成的二進位 MATLAB 可執行文件(MEX, MATLAB executable)。與普通的 C/C++/FORTRAN 不同,MEX 源文件需要額外設置 gateway 函數來對接 MATLAB。Mathworks 也提供了相關的頭文件,提供了一些數據類型的定義,以及對數據大小的預處理等各類功能。

這一功能在提升某些運算方面具有極大的潛力。對於同一架構、同一操作系統、同一 MATLAB 版本而言,編譯完成後的 MEX 文件是通用的。但反之,架構、操作系統或 MATLAB 版本中的任一因素均可導致 MEX 文件不可通用。所以,對於開源軟體作者而言,還是維護源代碼比維護二進位發行版更為現實。但這也要求用戶需要掌握對 MEX 編譯環境的配置。


MEX 相關功能在三類主流操作系統上都有所支持,但各個系統上 MATLAB 所支持的編譯器種類不盡相同。Windows 上受 MATLAB 支持的編譯器種類是最多的,其中包括由 Intel Parallel Studio 自帶的大名鼎鼎的 Intel C++ Compiler。

在大多數情況下,編譯器安裝好後,通過簡單執行 mex -setup language_name ,MATLAB 就能通過環境變數或註冊表值找到所需的編譯器文件。但是,有可能出現以下幾種情況:

  • 環境變數設置不正確
  • 註冊表鍵值設置不正確
  • MATLAB 版本號較小,無法支持當前新版本的編譯器(如 R2017a 無法支持 Intel Parallel Studio XE 2018,默認只能支持 2017 及以下版本)

就個人經歷而言,曾把 Visual Studio 2017 從 SSD 的系統盤中卸載後重裝到 HDD 中去過一次,但重裝後對應的註冊表鍵值卻沒有被安裝程序重新修改。對於這種情況,在設置 mex 時開啟 verbose 模式就可以看得很清楚到底哪裡缺東西或是搞錯了。

>> mex -setup C++ -vVerbose mode is on.... Looking for compiler Intel C++ Composer XE 2013 with Microsoft SDK 7.1 ...... Looking for environment variable ICPP_COMPILER14 ...No.... Looking for environment variable ICPP_COMPILER13 ...No....... Looking for registry setting HKLMSOFTWAREWow6432NodeMicrosoftVisualStudioSxSVS7 15.0 ...Yes (Some_Wrong_Path).... Executing command set "vcroot=Some_Wrong_Path"&for /f "delims= " %a in (type "Some_Wrong_PathVCAuxiliaryBuildMicrosoft.VCToolsVersion.default.txt") do @if exist "Some_Wrong_PathVCToolsMSVC\%ainHostX64x64cl.exe" call echo %vcroot% ...Yes (Some_Wrong_Path).

而對於無法兼容最新版編譯器的情況,在 MATLAB 或是對應編譯器的介面沒有 break changes 的情況下,一般是能夠兩邊調通的。要做的就是告訴 MATLAB,要去找哪些依賴文件,能運行怎樣的編譯命令。

在 GitHub:rymut/matlab-mex-intel18 這個倉庫中(MATLAB Central File Exchange 鏡像),我們就能找到讓 R2017a 支持 2018 版英特爾 ICC 的 XML 配置文件。而在 R2017b 中,已經內置了對應的 XML 配置文件。如果下載到對應路徑後,再運行開啟 verbose 模式的 mex setup 命令,就能看到與 XML 文件中 <locationFinder> 下相對應的搜尋過程了。

看完本文,可以試試運行 cd([matlabroot inwin64mexopts]) 進一步探索有哪些可以自由定製的選項。


本文亦發佈於 5t0n3 的技術自留地。


推薦閱讀:

MATLAB神經網路(四):基於Adaboost的強分類器設計
如何使用MATLAB畫三維的蘋果?
教你用Matlab畫一個單值複函數
Matlab如何製作屬於自己的縮寫詞典
有沒有地理信息可視化的繪圖軟體?

TAG:MATLAB |