標籤:

加速你的MATLAB開發(4): 自動生成C/C++代碼

博主問myc, 你覺得MATLAB最牛逼的Toolbox是啥?myc回答

就是各種Coder Toolbox啊。土豪的選擇,絕對值回售價。

作為MATLAB殺手級的應用,MATLAB Coder,Simulink Coder, Embedded Coder, HDL Coder可以將很多MATLAB程序,Simulink模型直接轉化成C/C++代碼。

有報道顯示東風汽車用Embedded Coder為他們的新一代電動客車的電池管理系統生成了10萬行代碼,實現了100%的代碼自動生成。

波音給X-40A無人太空梭的導航及控制系統編的代碼也是由Simulink Coder自動生成的

(此處停頓3秒,應有廣告費入賬

總之,用了Coder工具箱,腰不酸了,腿不痛了,C/C++也忘得差不多了……

博主等myc一口氣說了這麼多之後問

能讓我看看這麼神奇的工具怎麼用么。。

這裡用R2016a來做例子,首先你得確保你的電腦上有支持的編譯器,從R2015b起還支持MinGW喲。

接下來就是讓MATLAB定位你的編譯器了,我們在mac上用Xcode做例子

>>mex -setupnMEX 配置為使用 Xcode with Clang 以進行 C 語言編譯。nn>>mex -setup C++nMEX 配置為使用 Xcode Clang++ 以進行 C++ 語言編譯。n

好啦,開始生成代碼吧!鑒於我們的實習生myc是滑鼠點點族,他打開了MATLAB Coder App

好炫酷的App,好像一開始需要我們輸入一個想轉化成C/C++代碼的M文件,那我們來將上次編寫的代碼轉化為C++代碼。我們對原代碼稍作修改,給兩個輸入

function alpha = best(points1,points2)nM1 = rand(3);nM2 = rand(3);nalpha = zeros(2,size(points1,2));nna1 = M1 points1;na2 = M2 points2;nnfor i = 1:size(points1,2);n n A = [a1(:,i),-a2(:,i)];n y = rand(3,1);n AtA = A * A;n if rcond(AtA) < eps(double)n alpha(:,i) = 0;n elsen alpha(:,i) = A y;n endn nendnnend%End of bestn

在App中輸入best後回車進入下一步

這一步你可以加入其他的entry-point function, 我們這個簡單的例子就只有一個.點擊右下角Next。

這一步App將檢測你的代碼是否可以被轉化為C/C++,如果有任何問題,App還會給出修改建議。

我們的程序用到的都是MATLAB比較基本的功能,都支持代碼生成,點擊下一步繼續。

這一步我們要做的是給出輸入的數據類型,因為不同於MATLAB, C/C++需要在編譯時知道數據的類型和大小。我們可以給出一個調用best函數的例子。

然後雙擊下方points1和points2來定義數據類型

我們可以直接選擇double,或者選擇Define by Example。這裡我們選擇Double,然後定義數據大小。

如果你知道數據的上限,比如最多只有100個點,那麼可以用:100來表示。這裡我們不知道數據有多少,所以用:inf來表示

兩個輸入都定義完成後,點擊下一步進行Run-time校驗。

校驗通過後,就可以生成代碼啦

你可以選擇你的目標硬體,並生成平台兼容的代碼

這裡我們只選擇默認的MATLAB Host,在MATLAB裡面編譯和運行代碼。

同樣的你可以生成各種庫或是和你自己寫的C/C++編譯

我們選擇直接生成源代碼。點擊Generate然後開始玩吧

xkcd: Compiling

完成~

接下來你可以驗證生成的代碼是否正確,然後把代碼打包後發給別人編譯,也可以和已有的代碼進行混編,或是上傳到硬體里進行編譯。

很多人覺得MATLAB生成C/C++代碼的作用只是來給自己MATLAB代碼提速,如果只是這種目的話那簡直是用高射炮打蚊子了。利用Coder生成千千萬萬行符合標準且沒有Bug的C/C++代碼才是正確的打開方式。

鑒於MATLAB/Simulink在汽車行業中的廣泛應用[1],很有可能在你的車上就跑著由Coder自動生成的代碼。

myc說到這,想起了當年面試的時候和面試官說的話

給我一個Coder,我可以用MATLAB在五分鐘內寫一個跑在Raspberry Pi上的人臉識別系統

大概就是這樣~

[1]:MathWorks User Stories Listed by Product


推薦閱讀:

如何優雅地使用gams、matlab、AIMMS、LINGO?
怎麼用matlab 2017b的APP Designer?
為什麼很多計算機專業碩士生論文編程都是用MATLAB做的,僅僅是科學計算方面的優勢嗎?
為什麼不少程序員認為Matlab的語言設計不優雅甚至比較丑?能否舉出一些例子來說明?
matlab稀疏矩陣使用的是什麼數據結構?

TAG:MATLAB | 性能 |