VC++與Matlab混合編程的快速實(shí)現(xiàn)_第1頁
VC++與Matlab混合編程的快速實(shí)現(xiàn)_第2頁
VC++與Matlab混合編程的快速實(shí)現(xiàn)_第3頁
VC++與Matlab混合編程的快速實(shí)現(xiàn)_第4頁
VC++與Matlab混合編程的快速實(shí)現(xiàn)_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、VC+與 Matlab 混 合 編 程 的 快 速 實(shí) 現(xiàn) 劉 建 偉 吉 林 大 學(xué) 朝 陽 校 區(qū) 電 子 科 學(xué) 與 工 程 學(xué) 院 電 子 信 息 工 程 系 ( 長 春 ) 摘 要 : 許 多 工 程 軟 件 需 要 用 到 復(fù) 雜 的 數(shù) 學(xué) 算 法 。 VC+能 夠 形 成 各 種 用 戶 界 面 , 并 可 以 直接 與 系 統(tǒng) 及 底 層 硬 件 交 換 數(shù) 據(jù) 。 因 此 研 究 VC+和 Matlab 的 混 合 編 程 具 有 很 大 的 實(shí) 際 意 義 。 該 文 討 論 了 如 何 使 用 Matlab 的 Complier 將 *.m 函 數(shù) 編 譯 為 動(dòng) 態(tài)

2、鏈 接 庫 DLL, 提 供 給 VC+ 調(diào) 用 的 方 法 , 提 供 了 一 種 VC+與 Matlab 混 合 編 程 的 快 速 實(shí) 現(xiàn) 。 關(guān) 鍵 詞 : Matlab VC+ MCC Complier 動(dòng) 態(tài) 鏈 接 庫 DLL Matlab 作 為 當(dāng) 今 世 界 上 應(yīng) 用 最 為 廣 泛 的 數(shù) 學(xué) 軟 件 , 具 有 非 常 強(qiáng) 大 的 數(shù) 值 計(jì) 算 、 數(shù) 據(jù) 分析 處 理 、 系 統(tǒng) 分 析 、 圖 形 顯 示 甚 至 符 號(hào) 運(yùn) 算 的 功 能 。 已 經(jīng) 在 如 生 物 工 程 , 圖 像 處 理 , 語 音 處理 , 雷 達(dá) 探 空 , 聲 納 探 水 , 地

3、震 探 地 , 以 及 控 制 論 , 系 統(tǒng) 論 等 各 個(gè) 領(lǐng) 域 得 到 廣 泛 的 應(yīng) 用 。 它是 一 個(gè) 完 整 的 數(shù) 學(xué) 平 臺(tái) ,在 這 個(gè) 平 臺(tái) 上 ,用 戶 只 需 寥 寥 數(shù) 語 就 可 以 完 成 十 分 復(fù) 雜 的 功 能 ,大大 提 高 了 工 程 分 析 計(jì) 算 、 圖 像 處 理 的 效 率 。 但 是 Matlab 強(qiáng) 大 的 功 能 只 能 在 它 所 提 供 的 平 臺(tái)上 才 能 使 用 , 即 用 戶 必 須 在 安 裝 Matlab 系 統(tǒng) 的 機(jī) 器 上 才 能 執(zhí) 行 *.m 文 件 。 這 樣 當(dāng) 用 戶 需 要將 在 Matlab 下 已

4、開 發(fā) 完 畢 的 復(fù) 雜 算 法 應(yīng) 用 到 高 級(jí) 語 言 開 發(fā) 環(huán) 境 下 時(shí) 就 帶 來 了 問 題 , 是 將 現(xiàn)成 的 東 西 集 成 高 級(jí) 語 言 開 發(fā) 的 程 序 中 呢 ? 還 是 用 高 級(jí) 語 言 再 重 新 實(shí) 現(xiàn) 一 遍 ? 顯 然 大 家 所 期望 的 是 減 少 工 作 量 , 最 好 能 將 Matlab 下 開 發(fā) 好 的 程 序 或 函 數(shù) 直 接 應(yīng) 用 到 高 級(jí) 語 言 開 發(fā) 的 程序 中 , 這 就 是 Matlab 與 高 級(jí) 語 言 的 混 合 編 程 問 題 。 VC 是 當(dāng) 前 Windows 下 的 主 要 編 程 語 言 之 一

5、, 它 能 方 便 地 形 成 應(yīng) 用 軟 件 中 所 需 要 的各 種 用 戶 界 面 和 工 具 并 直 接 與 系 統(tǒng) 及 底 層 硬 件 交 換 數(shù) 據(jù) 。用 VC+開 發(fā) 的 系 統(tǒng) 具 有 容 易 維 護(hù)升 級(jí) 、 界 面 友 好 、 代 碼 效 率 高 、 執(zhí) 行 速 度 快 等 一 系 列 優(yōu) 點(diǎn) , 因 此 已 成 為 目 前 應(yīng) 用 軟 件 開 發(fā) 中廣 泛 采 用 的 主 要 工 具 之 一 因 此 , 如 何 將 Matlab 與 VC+進(jìn) 行 有 效 的 混 合 編 程 廣 受 工 程 科 研 人 員 的 關(guān) 注 。 解 決 這個(gè) 問 題 , 不 僅 能 更 好 地

6、發(fā) 揮 Matlab 強(qiáng) 大 的 功 能 , 還 能 快 速 地 進(jìn) 行 軟 件 開 發(fā) , 尤 其 是 當(dāng) 軟 件開 發(fā) 中 需 要 實(shí) 現(xiàn) 復(fù) 雜 的 數(shù) 學(xué) 算 法 、圖 形 處 理 時(shí) 尤 為 迫 切 。研 究 VC 與 Matlab 的 混 合 編 程具 有 很 大 的 實(shí) 際 意 義 。 MATLAB 與 Visual C+結(jié) 合 的 方 法 有 多 種 , 但 其 實(shí) 用 程 度 與 范 圍 不 同 。 常 用 的 方 法 有 :( 1) 將 Matlab 程 序 編 譯 成 C/C+源 文 件 并 嵌 入 VC+;( 2) 在 C C+程 序 中 利 用 Matlab engi

7、ne 調(diào) 用 Matlab 函 數(shù) ;( 3)在 C/C+程 序 中 直 接 使 用 Matlab C/C+ Math Library; (4)將 .m 文 件 編 譯 成 *.dll 文 件 嵌 入 到 VC+的 程 序 中 。 基 于 實(shí) 用 性 、 易 用 性 的 考 慮 , 本 文 主 要 討 論 第四 種 方 法 。另 外 隨 著 Matlab 版 本 的 升 級(jí) ,原 來 的 math library 已 經(jīng) 并 入 了 Compiler 之 中 ,是否 是 mathworks 比 較 推 崇 DLL 的 方 式 呢 ? 本 文 通 過 一 個(gè) 簡 單 的 例 子 來 說 明 Ma

8、tlab 和 VC+ 混 編 的 具 體 過 程 ( 環(huán) 境 為 Matlab6.5&VC+6.0)。 1 Matlab 編 譯 環(huán) 境 的 設(shè) 置 為 了 能 夠 使 用 Matlab的 Complier將 *.m函 數(shù) 文 件 編 譯 為 動(dòng) 態(tài) 鏈 接 庫 DLL,必 須 對(duì) Matlab 的 環(huán) 境 做 出 相 應(yīng) 的 配 置 。 具 體 做 法 如 下 : 在 Matlab 的 Command Window 下 輸 入 命 令 mbuild setup,并 根 據(jù) Matlab 的 提 示 選 擇 合適 的 編 譯 器 ,筆 者 使 用 的 是 Microsoft Visual C+

9、.過 程 如 下 mbuild -setup Please choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers y/n? Select a compiler: 1 Lcc C version 2.4 in D:MATLAB6P5syslcc 2 Microsoft Visual C/C+ version 7.0 in C:Program FilesMicrosoft Visual Studio .NET 3 Mi

10、crosoft Visual C/C+ version 6.0 in D:Microsoft Visual Studio 0 None Compiler: 3 Please verify your choices: Compiler: Microsoft Visual C/C+ 6.0 Location: D:Microsoft Visual Studio Are these correct?(y/n): 然 后 ,在 Command Window 中 輸 入 命 令 cd(prefdir);mccsavepath;這 是 為 了 后 面 使 用 Matlab 在 VC+ IDE 中 的 Ad

11、d-in 作 準(zhǔn) 備 。 然 后 輸 入 命 令 mex setup, 以 類 似 的 方 法 配置 編 譯 器 。 至 此 , Matlab 的 配 置 完 成 。 如 有 疑 問 , 可 以 參 閱 Matlab 的 幫 助 Matlab CompilerGetting StartedInstallation and configuration 一 節(jié) 。 2 創(chuàng) 建 動(dòng) 態(tài) 鏈 接 庫 ( *.DLL) 創(chuàng) 建 動(dòng) 態(tài) 鏈 接 庫 主 要 有 兩 種 方 法 : 一 種 是 使 用 Matlab 為 VC+ IDE 提 供 的 Add-in。 這種 方 法 比 較 簡 單 ,方 便 快

12、捷 ,只 要 在 VC+中 創(chuàng) 建 工 程 的 時(shí) 候 選 擇 Matlab Project Wizard,并 且 在 接 下 來 的 Step 1 中 的 Visual Matlab Application Type 選 擇 Shared M-DLL 就 可 以了 。 接 下 來 就 是 添 加 *.m 文 件 , 進(jìn) 行 編 譯 了 。 另 一 種 方 法 就 是 使 用 Matlab 的 mcc 命 令將 *.m 文 件 編 譯 為 動(dòng) 態(tài) 鏈 接 庫 ( *.DLL)。 因 為 Add-in 也 是 調(diào) 用 Compiler 的 命 令 mcc 進(jìn)行 編 譯 工 作 的 , 而 且 有

13、 時(shí) 候 這 個(gè) Add-in 還 會(huì) 出 現(xiàn) 不 能 使 用 的 情 況 , 因 此 這 里 主 要 討 論使 用 mcc 命 令 的 方 法 。 關(guān) 于 mcc 有 很 多 參 數(shù) 可 以 使 用 , 而 且 有 多 種 用 法 , 具 體 的 可 以 參 見 Matlab 的 幫 助 。 這 里 我 們 使 用 命 令 mcc B csglsharedlib:youlibname function1 funcion2 來 創(chuàng) 建 我們 所 需 要 的 動(dòng) 態(tài) 鏈 接 庫 DLL 文 件 。 其 中 參 數(shù) -B 表 示 使 用 的 是 Bundle Files 作 為 參 數(shù) , csg

14、lsharedlib 是 -B 的 參 數(shù) , 意 思 是 生 成 使 用 Matlab 圖 形 庫 的 C 共 享 動(dòng) 態(tài) 鏈 接 庫 , youlibname 是 你 想 要 生 成 的 動(dòng) 態(tài) 鏈 接 庫 DLL 的 文 件 名 ,注 意 csglsharedlib 與 youlibname 之 間 有 一 個(gè) 冒 號(hào) “ :” 連 接 , function1 為 你 想 要 加 入 到 動(dòng) 態(tài) 鏈 接 庫 DLL 中 的 函 數(shù) 名 , 如果 有 多 個(gè) 函 數(shù) , 各 個(gè) 函 數(shù) 名 用 空 格 隔 開 。 在 我 們 的 例 子 中 , 首 先 創(chuàng) 建 所 需 的 Matlab 函

15、 數(shù) 文 件 myfun.m。 function y=myfun(timeend) t=0:0.001:timeend; y=sin(2*pi*50*t); plot(y); 然 后 使 用 命 令 mcc -B csglsharedlib:mylib myfun 生 成 動(dòng) 態(tài) 鏈 接 庫 DLL。 Matlab 會(huì) 生 成一 系 列 文 件 , 其 中 mylib.h mylib.lib mylib.dll 以 及 相 同 目 錄 下 的 bin 下 的FigureMenuBar.fig 和 FigureToolBar.fig 是 我 們 在 以 后 所 需 要 使 用 的 。 3 在 V

16、C+中 使 用 Matlab 生 成 的 動(dòng) 態(tài) 鏈 接 庫 ( *.DLL) 為 了 能 在 VC+中 使 用 上 面 生 成 的 *.DLL,首 先 要 對(duì) VC+的 環(huán) 境 進(jìn) 行 一 些 設(shè) 置 : ( 1) 設(shè) 置 Include 和 Library 目 錄 在 VC+ IDE 中 選 擇 Tools-Options-Directories。 在 Show directoris for:中 選 擇 Include files, 添 加 如 下 兩 個(gè) 目 錄 : externinclude externincludecpp 在 Show directoris for:中 選 擇 Li

17、brary files, 添 加 如 下 兩 個(gè) 目 錄 : externlibwin32 externlibwin32microsofmsvc6 這 里 假 設(shè) 為 你 的 Matlab 的 安 裝 目 錄 。 這 些 操 作 只 需 要 一 次 , VC+ IDE 就 會(huì) 自 動(dòng) 記 錄 。 自 動(dòng) 應(yīng) 用 到 每 一 個(gè) 工 程 ( Project)。 ( 2) 工 程 (project)本 身 的 一 些 設(shè) 置 在 VC+ IDE 中 選 擇 Project-Setting-C/C+ 在 Category 中 選 擇 Code Generation, 在 Use run-time l

18、ibrary 中 選 擇 Multithreaded DLL。 在 Category 中 選 擇 Precompiled Headers,選 擇 Automatic use of precompiled headers,并 且 在 Through header 下 面 添 加 stdafx.h。 在 Category 中 選 擇 Preprocessor , 在 preprocessor definitions 中 添 加 MSVC,MSWIND,IBMPC. 在 VC+ IDE 中 選 擇 Project-Settings-Link 在 Categories 中 選 擇 Input, 在 I

19、gnore libraries:中 填 入 : msvcrt.lib。 ( 3) 為 工 程 添 加 相 應(yīng) 的 文 件 把 剛 才 生 成 的 mylib.h mylib.dll mylib.lib 和 externlibwin32 下 的 libmatpm.lib, externlibwin32microsofmsvc6 下 的 所 有 *.lib 文 件 復(fù) 制 到 VC+工 程 的 文 件 夾下 , 并 且 用 add files to project 添 加 的 工 程 中 。 接 下 來 就 可 以 使 用 剛 才 生 成 的 動(dòng) 態(tài) 鏈 接 庫 mylib.dll 了 。 首 先

20、 要 在 使 用 DLL 中 函 數(shù) 的 源文 件 中 加 上 頭 文 件 mylib.h。 在 使 用 之 前 還 需 要 對(duì) mylib.dll 進(jìn) 注 冊 , 使 用 完 畢 之 后 需 要對(duì) 其 進(jìn) 行 釋 放 。 注 冊 使 用 函 數(shù) mylibInitiallize();釋 放 使 用 函 數(shù) mylibTerminate()。 函 數(shù) 名的 規(guī) 則 就 是 youlibname+Initialize(Terminate). 這 兩 函 數(shù) 在 mylib.h 中 可 以 找 到 。 mylibInitialize()不 僅 注 冊 了 剛 才 生 成 的 mylib.dll,同

21、 時(shí) 它 也 注 冊 了 Matlab 本 身 的 一 些 動(dòng)態(tài) 鏈 接 庫 ( *.DLL); 同 理 mylibTerminate()不 僅 釋 放 了 剛 才 生 成 的 mylib.dll, 同 時(shí) 它 也釋 放 了 Matlab 本 身 的 一 些 動(dòng) 態(tài) 鏈 接 庫 ( *.DLL)。 因 此 在 注 冊 了 mylib.dll 之 后 , 我 們 也可 以 使 用 Matlab 的 數(shù) 學(xué) 庫 中 的 函 數(shù) , 例 如 mlfabs(), mlfAssign()等 等 。 在 使 用 mylib.dll 的 時(shí) 候 , 存 在 著 一 個(gè) VC+和 mylib.dll 中 的

22、函 數(shù) 之 間 數(shù) 據(jù) 交 互 的 問 題 。由 于 mylib.dll 中 的 函 數(shù) 所 接 受 的 參 數(shù) 是 mxArray 型 數(shù) 據(jù) 。 因 此 我 們 要 使 用 Matlab 為 我們 提 供 的 External Interfaces/ API 函 數(shù) 來 創(chuàng) 建 mxArray 型 數(shù) 據(jù) ,大 量 的 API 函 數(shù) 可 以 參 見Matlab 的 幫 助 文 件 MatlabExternal Interfaces/API ReferenceC MX-Functionsx 小 節(jié) 。還 有一 個(gè) 需 要 注 意 的 問 題 就 是 原 來 的 函 數(shù) 名 myfun 變

23、成 了 mlfMyfun。 可 以 在 mylib.h 中 看到 。 下 面 就 是 一 個(gè) 實(shí) 例 /包 含 頭 文 件 #include “mylib.h” . . . /注 冊 動(dòng) 態(tài) 鏈 接 庫 mylibInitialize(); double x=0.04; /創(chuàng) 建 mxArray 型 數(shù) 據(jù) 并 對(duì) 其 賦 值 mxArray *t; t=mxCreateDoubleMatrix(1,1,mxREAL); memcpy(mxGetPr(t),&x,sizeof(double); /或 者 使 用 t=mxCreateDoubleScalar(x) /或 者 使 用 Matlab

24、 數(shù) 學(xué) 庫 中 的 函 數(shù) mlfAssign()等 /使 用 mylib.dll 中 的 函 數(shù) mlfMyfun(t); /銷 毀 t, 釋 放 內(nèi) 存 mxDestroyArray(t); /注 銷 動(dòng) 態(tài) 鏈 接 庫 mylibTerminate(); 4 程 序 的 發(fā) 布 在 程 序 完 成 之 后 ,就 可 以 進(jìn) 行 打 包 發(fā) 布 了 。需 要 注 意 的 問 題 就 是 發(fā) 布 的 時(shí) 候 除 了 生 成 的 mylib.dll 和 FigureMenuBar.fig、 FigureToolBar.fig, 還 需 要 加 上 Matlab 的 一 些 動(dòng) 態(tài) 鏈 接庫 。 這 樣 發(fā) 布 的 程 序 就 可 以 完 全 脫 離 Matlab 的 環(huán) 境 而 獨(dú) 立 運(yùn) 行 了 。 如 何 得 到 這 些 動(dòng) 態(tài)鏈 接 庫 呢 ? 將 externlibwin32 下 的 mglinstaller.exe 解 壓 縮 , 會(huì) 得 到 mglarchive.exe, 再 將 mglarchive.exe 解 壓 縮 , 在 生 成 的 目 錄 binwin32下 就 是 程 序 獨(dú) 立運(yùn) 行 所 需 要 的 動(dòng) 態(tài) 鏈 接 庫 文 件 了 。 從 以 上 的 討 論 中 可 以 清 楚 的 看 到 , 使 用 Matlab 生 成 動(dòng) 態(tài)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論