精通VC與Matlab聯合編程(五)

精通VC與Matlab聯合編程(五)

作者:鄧科


淺析VC與MATLAB聯合編程<一>
淺析VC與MATLAB聯合編程<二>
淺析VC與MATLAB聯合編程<三>
淺析VC與MATLAB聯合編程<四>

  在前面的介紹中,只是簡介紹了VC與Matlab程序設計的幾個簡單例子,很多關鍵性的知識都沒有介紹(例如函數的輸入輸出格式,VC中調用工具箱函數,編譯器的使用,幾種方法的混合使用等等)在以後的文章中,將會對這些知識進行介紹(因此標題也改了一下,呵呵,如果有錯誤的地方,還望大家多多指點)VC調用Matlab的方法有多種,爲了對混合編程有一個大概認識,將常用的幾種方法中介紹一下:

一、通過Matlab Engine方式
  Matlab Engine是指一組Matlab提供的接口函數,支持C語言, Matlab Engine採用C/S(客戶機/服務器)模式,Matlab作爲後臺服務器,而C程序作爲前臺客戶機,通過Windows的動態控件與服務器通信,向Matlab Engine傳遞命令和數據信息,從Matlab Engine接受數據信息。用戶可以在前臺應用程序中調用這些接口函數,實現對Matlab Engine的控制。採用這種方法幾乎能利用Matlab全部功能,但是需要在機器上安裝Matlab軟件,而且執行效率低,因此在實際應用中不採用這種方法,在軟件開發中也不可行,我認爲適合個人使用或做演示用,因此不打算介紹。

二、直接調用Matlab的C/C++數學函數庫
  Matlab中提供了可以供C/C++語言調用的C/C++數學函數庫,其中包含了大量用C/C++語言重新編寫的Matlab數學函數,這些函數涉及到線形代數、數值分析、傅立葉變換、多項式計算、解微分方程等,並且函數庫中提供了大量各種矩陣操作函數,在VC中可以直接使用這些函數,通過這些函數可以在VC中方便的實現在Matlab中矩陣運算功能。可以看出用這種方法可以很靈活的調用Matlab來編寫應用程序,但要求讀者對C/C++語言比較熟悉,可以看出使用這種方法調用Matlab的工具箱函數有很大困難。適合對C/C++語言比較熟悉的用戶使用,

三、用Matlab自帶的Matlab Compiler
  Matlab Compiler的作用是將m文件轉化成C/C++代碼(也就是通常所用的mcc命令),這種源代碼需要用C/C++編譯器編譯連接成獨立應用程序,在將m文件轉成獨立應用程序的過程中生成的C/C++文件,原則上是可以被其它的C/C++代碼調用的,編譯器可以通過設置mcc命令的選項,將m文件編譯成動態鏈接庫文件、C/C++文件、可執行文件等一系列文件。到matlab R21.1爲止,Matlab Compiler的m程序轉換成C/C++代碼功能有很多限制:

  1. 不能轉換腳本m文件,只能轉換m函數;
  2. 不能使用matlab對象;
  3. 不能用input或者eval操作matlab空間變量;
  4. 不能動態地命名變量,然後用load或者save命令來操作;
  5. 不能處理具有嵌套調用其他m文件的m文件;
  6. 不能使用MATLAB內聯函數;

四、使用matlab的combuilde工具
   COM是component object module的簡稱,它是一種通用的對象接口,任何語言只要按照這種接口標準,就可以實現調用它。matlab6.5新推出來的combuilder就是把用matlab編寫的程序做成com組件,供其他語言調用。該方法實現簡單,通用性強,而且幾乎可以使用Matlab的任何函數(注意:不支持腳本文件,腳本文件使用時要改爲函數文件),因此在程序較大、調用工具箱函數或調用函數較多時推薦使用,這也是Matlab公司(Matlab公司就是Mathworks公司)推薦的使用方法。

五、使用matcom工具。
  這是個第三方控件,很小(8M多),原本屬於mathtool公司,後來被Mathworks公司合併了,使用該工具可以將m腳本文件和m函數轉化成相同功能的C/C++文件,相比其它方法使用matcom具有如下優點:

  1. 轉換過程簡單(由matcom工具自動實現),容易實現;
  2. 可以方便的生成動態鏈接庫文件(dll)和可執行文件(exe);
  3. 不僅可以轉換獨立的腳本文件,也可以轉換嵌套腳本文件;
  4. 設置環境後,可以使用Matlab的工具箱函數;

但matcom也有以下不足:

  1. 對struct等類的支持有缺陷,對class數據類型;
  2. 部分繪圖語句無法實現或得不到準確圖象,尤其是三維圖象;

因此在不涉及到三維做圖以及m文件不大的情況下推薦使用。

  以上幾種方法可以單獨使用,也可以混合使用。這裏簡單的介紹了VC和matlab接口的幾種方法,讀者可以根據需要選擇適合自己的方法。需要說明的是上以上幾種方法並不是相互獨立的,而是有相互聯繫的,比如使用C/C++函數庫與使用編譯器,對於實現相同功能的程序,直接調用函數庫與使用編譯器最終生成的代碼可能相差不大,只不過一個是直接在VC中寫C/C++代碼,一個是在Matlab中寫好m代碼,然後通過編譯器將m代碼轉化成相同功能的C/C++代碼,而在轉化的過程中也需要調用相應的C/C++函數庫文件。在後面的文章中將從第二種方法開始進行介紹。


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章