1. 程式人生 > >matlab程式碼到C++程式碼轉化及使用全攻略

matlab程式碼到C++程式碼轉化及使用全攻略

1.在matlab中輸入命令:

mbuild -setup 安裝編譯器。(注意點:選擇計算機上已有的VC/VS編譯器,並輸入相應的路徑)

2.在matlab中輸入命令:

deploytool   進入該模式

3.按新建按鈕,選擇C++ Shared Library,進行工程的命名,並選擇路徑。然後Add Files,將要轉換的M檔案選擇好。最後,build the project,編譯該M檔案。編譯成功後,程式碼會生成在指定目錄的distrib資料夾下。該資料夾下生成了一個dll檔案,一個頭檔案和一個lib檔案。(這裡要注意的是matlab是分32位版本和64位版本的,用相應版本matlab按照這個流程走下來生成的是相應版本的dll檔案和lib檔案。所以,在vs中呼叫的時候要調整成相應的版本。比如用64位的matlab生成的dll和lib檔案要在VS中的x64平臺下執行,不然會產生Link error。要注意平臺的統一,VS中有些控制元件,比如COMM控制元件只支援32位,這樣為了統一使用,前面也要用32位的matlab)

4.將第3步生成的檔案複製到VS工程中。

將matlab/extern下的include資料夾複製到VS的工程中,並在VC++目錄的包含目錄中新增進去。

將matlab/extern /lib/win64/microsoft下的libmat.lib,mclmcr.lib,mclmcrrt.lib複製到VS工程中,並在連結器/輸入/附加依賴項中新增這幾個庫

5.在程式碼中呼叫dll。

(1)初始化庫   mclInitializeApplication(NULL,0)

                      xxxInitialize()   xxx為第3步生成檔案的名字

(2)對mwArray的操作

如matlab中一階小波消噪函式wden(in1,in2,in3,in4,in5,in6);    

轉化後變成這樣:

extern LIB_wden_CPP_API void MW_CALL_CONV wden(int nargout, mwArray& xd, mwArray& cxd, mwArray& lxd, const mwArray& in1, const mwArray& in2, const mwArray& in3, const mwArray& in4, const mwArray& in5, const mwArray& in6); 

nargout ——— 輸出變數的個數

xd —— 輸出變數 消躁後的訊號

cxd ——輸出變數 xd的子小波

lxd —— 輸出變數 xd的子小波

in1 —— 輸入變數 原始訊號

in2 —— 輸入變數 閾值選擇規則 可選模式:'rigrsure','heursure','sqtwolog','minimaxi'

in3 ——輸入變數 軟閾值或硬閾值  可選模式: ‘s’ or 'h'

in4 —— 輸入變數 閾值尺度的改變  可選模式:‘one’,'sln','mln'

in5 —— 輸入變數 小波變換的層數

in6 —— 輸入變數 小波型別 如'db10','sym8'

例子:要實現XD_Filter = wden(XD,‘minimaxi’,'s','mln',5,'db10');的功能 。程式碼如下:

const int DataNum = 5500;        
char str1[9] = "minimaxi";
char str2[2] = "s";
char str3[4] = "mln";
int  str4 = 5;
char str5[5] = "db10";
mwArray Str1(str1);
mwArray Str2(str2);
mwArray Str3(str3);
mwArray Str4(str4);
mwArray Str5(str5);
mwArray XD(DataNum, 1, mxDOUBLE_CLASS);
mwArray XD_filter(DataNum, 1, mxDOUBLE_CLASS);
mwArray cxd(DataNum,1, mxDOUBLE_CLASS);
mwArray lxd(DataNum,1, mxDOUBLE_CLASS);
XD.SetData(in, DataNum);
wden(1, XD_filter, cxd, lxd, XD, Str1, Str2, Str3, Str4, Str5);
XD_filter.GetData(out, DataNum);

(3)為了以後方便使用可以進一步將該工程的類寫成dll形式。