告別mex崩潰調試法: 藉助visual studio調試
mex是MATLAB運行C/C++代碼的一種手段, 一旦完成, 使用方法和普通的MATLAB函數是一樣的.之所以使用它, 主要目的是為了提速. 當你使用了一切MATLAB技巧(向量化, 並行循環, profiler等), 速度還是不夠快的時候, mex是一個大殺器(當然, 大殺器不能輕易使用 , 因為你要用C/C++語言來寫, 一般比較花時間, 使用MATLAB的人一般就是看重MATLAB的快速編程優勢)
mex一般有兩種生成方法:
第一種, 藉助coder, 自動生成mex
優勢是: 1 快速生成 2 一般是沒有bug的
缺點: 1部分MATLAB函數不被coder不支持 2 生成的mex速度有可能還不如MATLAB的普通函數. 原因是自動化生成的東西, 有大量冗餘在裡面.
我在這篇文章裡面也介紹過一點coder.
芷菡:完全沒辦法看內置函數的源代碼了嗎?第二種, 自己手工寫C/C++代碼, 或者網上下載C/C++, 修改成mex介面.
優勢是: 1 運行速度一般比較快(只要代碼寫得不要太爛了)
缺點是: 1 比較耗時(你懂的, 同樣的功能, C/C++的代碼長度比MATLAB代碼長的多)
2 容易產生bug
關於怎麼盡量避免bug, 我的經驗做法是:
寫C/C++的風格的MATLAB代碼, 完成演算法, 並且調通. 然後直接翻譯成C/C++.
所謂的"C/C++的風格的MATLAB代碼"指的是:
1 不要用向量化, 滿屏幕的for循環嗨起來.
2 不要用高級函數, 使用基本函數(C/C++有對應的函數, 比如四則運算, 三角函數等)
使用了這種方法寫mex, 出bug的幾率就很小了.
但是寫完了C/C++, 並轉換成了mex, 運行時, 發現某些corner cases產生了bug, 怎麼辦呢?
如果是昨天的我, 會將這些corner cases保存成文件, 然後寫一個main函數, 讀取文件, 然後按照C/C++的debug基本流程來debug.
但是這是一種比較間接的方法. 今天讀了一下MATLAB的mex相關的文檔, 學到了一招, 可以直接調試. 也就是這篇文章的主題.
第一步, 命令窗口輸入:
mex -g yprime.c
注意, 通常我們編譯成mex文件, 使用的命令是:
mex yprime.c
多輸入了"-g"
生成了兩個文件: "yprime.mexw64"和"yprime.mexw64.pdb"
第一個文件不意外, 就是我們需要的mex文件, 第二個文件我第一次見到, 看最後結尾".pdb", 應該是用來調試, 符合我的debug意圖.
第二步, 打開mex設置版本的visual studio:
第三步, "工具"," 附加到進程", 就會出現下面的對話框:
選中MATLAB.exe, 然後點"附加"
第四步, "文件", "打開", 選中"yprime.c"
第五步, 想要設置斷點的行設置斷點
這個就不細說了, 這個都不知道的讀者可能不適合使用mex了.
第六步, 運行mex文件.
yprime(1, 1:4);
可以看到visual studio在斷點出停住了.
第七步, visual studio的常規debug操作了.
第八步, 找到出錯源代碼, 改正後, 再生成mex
第九步, 如果還是出錯. 那麼第一步到第八步再來一遍.
推薦閱讀:
※Eigen 矩陣運算庫在實際項目中的使用情況如何?
※Matlab初學之(一)
※Cody簡介
※為什麼matlab學生版不向中國發售?如何才能在國內買到學生版的matlab?
※請通俗易懂地解釋一下guidata()的用法?以及他是如何幫助參數在GUI間傳遞的?
TAG:MATLAB |