Matlab高級教程_第三篇:Matlab轉碼C/C++方式(混編)_第一部分


0. 其實Matlab的轉碼混編大多數就是為了現成的算法函數不用再寫了,2就是為了方便提高代碼運行速度用C語言去運行。

 

1. MEX文件:

  Mex文件是一種可在matlab環境中嗲用C語言(或fortran)衍生程序,mex的編譯結果實際上是一個帶輸出函數的mexFunction的dll文件。

  備注:如果觀察Matlab的發展史可知,Matlab最早是用了fortran的線性函數庫作為教學軟件給學生們學習的。

  Mex從字面上是matlab和execute兩個單詞的縮寫。

  .Mex文件實現了一種其他語言與matlab的接口,通過mex文件可以在matlab中像調用內嵌函數一樣調用使用C語言和Fortran等語言辨析的函數,實現了代碼重用,同時也能夠提高matlab環境中數據處理的效率。

  Mex文件格式:

  #include "mex.h"
  void  mexFunction (  int  nlhs, mxArray *plhs[],  int  nrhs,  const  mxArray *prhs[] )
  {
  }

   編寫Mex程序的編譯器可以使用matlabdiamante編輯器,也可以使用自己的C++編譯器你,如VS2008等。

  上面這四個參數分別用來輸出和輸入數據:nlhs是輸出參數個數,plhs是輸出參數指針,nrhs是輸入參數個數,prhs是輸入參數指針。

  注意:對輸出和數據參數的操作都是通過指針方式進行的;matlab指針是從1開始,C的指針是從0開始的。C語言需要首先分配內存空間,因此在編碼的時候也需要注意。

 

2. MEX環境配置

  在matlab中配置需要輸入

>>mex -setup

  但是常有錯誤,其matlab自帶的編譯器也並不太好用,因此可以選用網上的編譯器拷貝到matlab當中使用。當然還有一種可能是因為盜版的問題。因此在輸入上面命令的時候可能會提示如下信息:

錯誤使用 mex
未找到支持的編譯器或 SDK。您可以安裝免費提供的 MinGW-w64 C/C++ 編譯器;請參閱安裝 MinGW-w64 編譯器。有關更多選項,請訪問
http://www.mathworks.com/support/compilers/R2016b/win64.html。

  這里用的是matlab2016b版本,因此我們需要MinGW-w64 C/C++這個編譯器。具體配置方式見3。

 

3. 具體配置編譯器的方法

  上TDM-GCC官網去下載這個編譯器,注意64位和32位不同。

  網址:http://tdm-gcc.tdragon.net/download

  第一步:把這個文件下載下來,安裝上,這里建議安裝到C盤並記住這個安裝目錄。

  “Create”----“MinGW-64/TDM64(32-bit and 64-bit)”----C:\TDM-GCC-64----SourceForge Default----安裝

  第二步:在matlab命令行運行命令setenv(‘MW_MINGW64_LOC’,folder),這里的foler就是剛才的目錄,因此改為:

  setenv('MW_MINGW64_LOC','C:\TDM-GCC-64')

  第三步:設定環境變量

  

  第四步:重啟matlab

  第五步:檢測一下,還是跟上嗎一樣輸入mex -setup

  這樣就表示成功了,這些更新新的API不用管它。

  實際過程要選mex -setup C++編譯器。后面具體轉碼過程再說。這些是安裝matla編譯器也就是第一步。

 

4. 注意:在這個轉碼的過程中千萬Matlab編碼的版本要略小於Visual Studio的版本。這樣防止轉碼不兼容的問題。這里采用的matlab R2016b

  visual studio的版本是2017版本。具體的這個版本適用在matlab當中有,可以參照相關資料。也就是2中紅色警告字體當中的那個網址,里面都有對於編碼版本和SDK包等的相關配置信息。

 

5. 關於官網的轉碼例子(視頻)

官網視頻地址:https://ww2.mathworks.cn/videos/matlab-to-c-made-easy-81870.html?elqsid=1534613526595&potential_use=Home

中文視頻地址:https://ww2.mathworks.cn/videos/generating-cc-code-from-matlab-using-matlab-coder-82536.html?elqsid=1534701215344&potential_use=Home

 

《Matlab to C Made Easy》

Generating realable and portable C code from your Matlab alogrithms

Agenda

*Motivation

-Why translate Matlab to C?

-Challenges of manual translation

*Using matlab Coder

-Three-step workflow for generation code

*Use cases

-integrate algorithms using source code/libraries

-Accelerate through Mex

-Prototype by generating EXE

5.1 記住要在MATALB本地文件夾下進行轉碼

5.2 例子如下:

* 觀察編譯環境是否在MATLAB下,且添加子文件夾到目錄

* 編輯器中生成函數:

function c=myMult(a,b)

% Mutiple two inputs

c = a*b;

* 另外在生成一個測試函數的m文件(文件名myTestBench)

myMult(10,20) //注意這里不要加分號,要顯示結果

* 在app或者命令行輸入Coder,打開命令。

** Select---》輸入剛才的函數名“myMult”

E:\MATLAB\R2016b\Work\SimpleDemo\myMult.prj //會看到生成的工程項目

下一步

** Define Input Types---》 輸入剛才的測試名“myTestBench”

會看到函數當中的輸入函數名,在這里定義函數的長短類型,這里選擇雙精度,如果變量長度不定,可以選擇inf

下一步

** Check for RunTime Issues---》進行生成過程,完成后(在這里會遇到函數需要預定義變量長度,預先分配內存空間等問題需要重新解決)

下一步

** Generate Code---》這里進行生成代碼選項

生成代碼

 

6. 關於生成代碼過程中的一些問題總結

 問題1:%#codegen的說明

把一些提示代碼警告去掉

 

問題2:實現約束

function a = foo(b,c)

a = b*c

有可能是一個元素乘以一個元素

有可能是點乘

有可能是一個矩陣乘法

數據結構還有可能是邏輯性、整數型、復數型等

* 多形性:同一個matlab對應不同C語句的實現

* 內存分配 :內存的預分配、動態內存還是靜態內存

* 矩陣行列處理

* 定點數據類型

 

關於實現約束的例子:Newtom-Rhapson算法的例子(更高的例子的實現

* 預分配

* 尋找更有效的構架

* 編譯選項

函數內容:

 

問題3:各部分功能翻譯解釋:

3.1 Select 界面(添加函數內容)

 Numeric Conversion (數值轉換,一般選擇默認)

:默認

:Convert to fixed point(轉換為不動點數據類型,小數點固定)

:Convert to single precision(轉換為單精度數據類型)

 

The MATLAB Coder workflow generates standalone C and C++ code from MATLAB code,to begin,select your entry-point functin(s).(選擇入口點函數)

Generate code for function:輸入生成函數名

Project location:項目名地址(后綴為.prj)

The specified project already exits.you can reopen the existing project,overwrite it,or enter  a differnt name.(指定的項目已經退出。您可以重新打開心有的項目)

 

3.2 Define界面(Define Input Types,定義輸入類型)

To conver MATLAB to C,you must define the type of each input for every entry point function.

(MATALB轉換為C,你必須定義所有入口點函數的每一個輸入變量類型)

To automatically define input types,call xxx or enter a script that calls xxx in the MATLAB prompt below:

可以定義單個的輸入變量類型、還可以添加全局變量類型,如果選擇Autodefine Input Types(自動定義輸入類型),也可以自動選擇,但是也需要手動觀察是否有錯誤。

這里的這個界面(這里采用R2016b)可能和其他版本不一樣,在早期版本,可以直接定義,在2016版本還要生成一個關於要生成函數的測試腳本(script)來進行測試,

通過這個位置進行變量類型的定義(之前可以不用生成這個測試腳本調試,可以直接調試入口點函數每一個輸入變量的類型)

關於輸入變量類型進行說明(注意:C語言的變量需要預定義,因此不光要定義入口的函數尺寸,過程中的函數尺寸,還有出口的函數尺寸

 double/single(雙精度/單精度數據類型)

可以選擇1*1的標量

可以選擇1*n列的向量

可以選擇m行*1列的向量

可以選擇m*n的矩陣

第一:確定長度僅此為1

第二:確定長度最長為1(可以為零,一側長度可以規定最長延伸到那個位置)

第三:無約束無線長度

定義所有未定義作為xx雙精度

add global添加全局變量(沒有需要不選一般)

 

3.3 Check For Run-Time Issues(檢查運行時,檢查函數當中是否存在編碼的錯誤)

 

Enter code or select a script that exercises XXX

鍵入代碼或選擇一個腳本測試XXX(待生成函數)

Generating trial code(生成試代碼)

Building Mex(建立Mex文件,主要代碼的轉碼要在MATLAB目錄下生成,一般建立一個工作文件夾)

Running test file with Mex(用Mex去測試文件)

(如果編碼過程中,注入變量長度未定義等等問題會在這個地方通過不了)

 

3.4 CHECK FOR ISUES

3.5 SETTINGS(設定項)

 Paths(路徑):

  Project folder(項目路徑)

    A subfolder of the project folder(項目目錄下的一個子目錄)

  MATLAB current working folder(MATLAB目前工作路徑)

  Specified folder(指定文件夾)

 

Speed(速度):

  Enable responsiveness to CTRL+C and graphics refreshing(啟用對CTRL+C和圖形刷新的響應性:默認可選

  Keep extrinsic calls(保存外部呼叫:默認可選

  Ensure memory integrity(保證內存完整性:默認可選

  Saturate on integer overflow(這樣當模塊的值輸入與枚舉值的基礎值不匹配時,Simulink 將使用枚舉類型的默認值:默認可選

 

Memory(內存):

  Global data synchronization mode(全局數據同步模式):

    At MEX-function entry,exit and extrinsic call:(MEX 函數輸入,退出和外部呼叫:默認可選

  Variable Sizing Support(變量持倉支持):

    Dynamic memory allocation(動態內存分配法):

      For arrays with max size at or above threshold(對於最大或大於閾值的陣列)

        Dynamic memory allocation threshold(動態內存大小閾值)

      For all variable-sized arrays(對於所有可變大小的數組:默認可選

  Stack usage max(堆棧使用最大值):

 

Code,Apperance(代碼,外觀):

  Generated file partitioning method(生成文件划分方法):

    Generate one file for each MATLAB file(為每個Matlab文件生成一個文件:默認可選): 

    Generate all functions into a single file(將所有函數生成到單一文件中):

  Comments(備注):

    Include comments(后面都可以不選)

 

Debugging(檢測):

  Enable C compiler debug mode(啟用C編譯器模式調用):

  Always create a code generation report(始終創建代碼生成報告:默認可選):

  Automatically launch a report if one is generated(如果生成報表,則自動啟動報表):

 

Custom Code(自定義代碼):這些可以不用選

All Settings(所有設置)

 

3.6 Generate Code(生成代碼)

Toolchain(工具鏈)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM