MATLAB + VS 2015混合編程并調(diào)試

對(duì)于大規(guī)模重復(fù)的運(yùn)算,為了提高運(yùn)算速度肛捍,可以將部分核心代碼用C++來實(shí)現(xiàn),用編譯器編譯成動(dòng)態(tài)可執(zhí)行文件(mex文件)之众,在MATLAB中直接調(diào)用拙毫。

個(gè)人親歷,有一段Monte-Carlo仿真的MATLAB代碼棺禾,在Intel 8700K+32G的機(jī)器上缀蹄,運(yùn)行時(shí)間在1周左右,經(jīng)過C++重構(gòu)核心代碼后,可以在2天內(nèi)完成缺前。同時(shí)蛀醉,由于內(nèi)存的占用降低,可以進(jìn)行更大規(guī)模的仿真衅码。

MATLAB版本:R2018b拯刁;C++編譯器:Visual Studio 2015 Professional

關(guān)于不同版本MATLAB支持的編譯器,參考官網(wǎng)鏈接逝段。

一垛玻、在Visual Studio中編寫C++文件。

1.1 新建一個(gè)win32項(xiàng)目

項(xiàng)目名最好與函數(shù)名一致奶躯,注意應(yīng)用程序類型設(shè)置為DLL帚桩。

1.2 配置項(xiàng)目屬性。

  • 在項(xiàng)目名稱上右鍵 -> 屬性即可打開項(xiàng)目屬性頁嘹黔。
  • 配置屬性->配置管理器->活動(dòng)平臺(tái)解決方案 -> 新建解決方案平臺(tái) -> x64账嚎;
  • 配置屬性->C++ ->附加包含目錄,加入MATLAB目錄下的\extern\include 路徑参淹,默認(rèn)為C:\Program Files\MATLAB\R2018b\extern\include醉锄;
  • 配置屬性->鏈接器->附加庫目錄,加入MATLAB目錄下的\extern\lib\win64\microsoft路徑浙值,默認(rèn)為C:\Program Files\MATLAB\R2018b\extern\lib\win64\microsoft恳不;
  • 配置屬性->鏈接器->輸入->附加依賴項(xiàng), 添加libmx.lib开呐,libeng.lib烟勋,libmat.lib,libmex.lib這四個(gè)lib文件筐付;
  • 配置屬性->鏈接器->常規(guī)->輸出文件卵惦,改為x64\Debug\vlda.mexw64 (vlda為項(xiàng)目名稱);
  • 配置屬性->配置屬性->常規(guī)->目標(biāo)文件擴(kuò)展名,改為.mexw64;
  • 新建模塊定義文件瓦戚,vlda.def沮尿,內(nèi)容為
LIBRARY;"vlda"  // vlda為項(xiàng)目名稱 
EXPORTS mexFunction
  • 配置屬性->鏈接器->輸入->模塊定義文件,vlda.def较解;

1.3 編寫函數(shù)文件

在源文件里面已有vlda.cpp(vlda為項(xiàng)目名稱)畜疾,在vlda.cpp中編寫MEX函數(shù)文件。

mex函數(shù)的編寫注意事項(xiàng):

  • 注意檢查輸入的參數(shù)類型印衔,參數(shù)數(shù)目妻献,MATLAB默認(rèn)的數(shù)據(jù)類型為double,一旦不匹配躲惰,MATLAB調(diào)用時(shí)會(huì)直接崩潰砂沛;
  • 注意內(nèi)存泄漏献烦,分配的內(nèi)存彤敛,記得釋放掉;
  • MATLAB 中的parfor可以在C++ 中輕松使用OpenMP實(shí)現(xiàn)了赌,具體為添加庫文件
# include "omp.h"

同時(shí)墨榄,在for循環(huán)前加上如下預(yù)編譯指令

#pragma omp parallel for 
  • 使用OpenMP時(shí),配置屬性->C++ ->語言->OpenMP支持揍拆,選為"是";

1.4 生成解決方案

編寫好mex函數(shù)后渠概,在項(xiàng)目名稱上右鍵->生成,從而進(jìn)行編譯嫂拴,生成.mex64文件播揪。

二、調(diào)試

  • 將生成的.mexw64拷貝到MATLAB當(dāng)前目錄筒狠。
  • 菜單欄:調(diào)試->附加到進(jìn)程->選擇MATLAB進(jìn)程猪狈,附加到進(jìn)程后,會(huì)經(jīng)歷較長時(shí)間的符號(hào)加載過程辩恼;
  • 如果符號(hào)加載時(shí)間過長雇庙,可以通過設(shè)置符號(hào)位置來解決,菜單欄:調(diào)試->選項(xiàng)->符號(hào)->勾選Microsoft符號(hào)服務(wù)器灶伊;
  • 在源代碼vlda.cpp中設(shè)置斷點(diǎn)疆前;
  • 在MATLAB中調(diào)用.mex64文件,會(huì)跳轉(zhuǎn)到VS 2015 中的斷點(diǎn)聘萨,F(xiàn)10可單步執(zhí)行竹椒;
  • 調(diào)試過程中修改vlda.cpp,重新生成解決方案米辐,將新生成的mexw64文件拷貝到MATLAB當(dāng)前目錄胸完,此時(shí),需要在matlab中clear掉原來的mexw64文件翘贮,即運(yùn)行命令
clear vlda.mexw64

三赊窥、發(fā)布

對(duì)于比較簡單的程序,直接用Debug版本的也沒什么問題狸页,但最好還是使用Release版本锨能。

  • 配置屬性->配置管理器->活動(dòng)解決方案配置->Release ,其他設(shè)置參照1.2配置項(xiàng)目屬性設(shè)置。
  • 如果mexw64文件需要拷貝到別的電腦上運(yùn)行芍耘,可以考慮采用靜態(tài)編譯腹侣。配置屬性->C++ ->代碼生成->運(yùn)行庫:多線程(/MT);配置屬性->常規(guī)->MFC的使用:在靜態(tài)庫中使用MFC齿穗。

四、總結(jié)

將部分核心代碼用C++實(shí)現(xiàn)后饺律,能夠極大的提高運(yùn)算速度窃页,同時(shí)降低內(nèi)存的使用跺株。另一方面,借助于OpenMP脖卖,可以很方便的實(shí)現(xiàn)并行計(jì)算乒省,將多核CPU的利用率維持在100%。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畦木,一起剝皮案震驚了整個(gè)濱河市袖扛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌十籍,老刑警劉巖蛆封,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勾栗,居然都是意外死亡惨篱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門围俘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砸讳,“玉大人,你說我怎么就攤上這事界牡〔炯牛” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵宿亡,是天一觀的道長常遂。 經(jīng)常有香客問我,道長她混,這世上最難降的妖魔是什么烈钞? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮坤按,結(jié)果婚禮上毯欣,老公的妹妹穿的比我還像新娘。我一直安慰自己臭脓,他們只是感情好酗钞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著来累,像睡著了一般砚作。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘹锁,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天葫录,我揣著相機(jī)與錄音,去河邊找鬼领猾。 笑死米同,一個(gè)胖子當(dāng)著我的面吹牛骇扇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播面粮,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼少孝,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了熬苍?” 一聲冷哼從身側(cè)響起稍走,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柴底,沒想到半個(gè)月后婿脸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡似枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盖淡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凿歼。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褪迟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出答憔,到底是詐尸還是另有隱情味赃,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布虐拓,位于F島的核電站心俗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蓉驹。R本人自食惡果不足惜城榛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望态兴。 院中可真熱鬧狠持,春花似錦、人聲如沸瞻润。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍撞。三九已至正勒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間傻铣,已是汗流浹背章贞。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留非洲,地道東北人阱驾。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓就谜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親里覆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容