Windows编程之调用Matlab
一、選擇matlab:
注意。Matlab的安裝需要較長時間,建議本拓展在同學們自己的電腦上運行。
Matlab是大多數工科學生必修的科目,是一個口碑極佳的數學計算工具,可以支持立即運算和程序設計兩種形式。Matlab較新的版本均提供32位版本和64位版本。在安裝時,32位操作系統只能安裝32位matlab,64位操作系統最好安裝64位matlab,但是也能安裝32位matlab。
本教程將學習使用VC++6.0與matlab交互,而VC++6.0所編譯的程序,也就是我們所寫的代碼,經過編譯以后,是32位的,故只能和32位matlab進行交互。若將來使用高版本的VC++,編譯出64位可執行程序,則就可以和64位matlab交互了。本教程以matlab2014作為連接對象。
首先來簡單安裝32位matlab。使用虛擬光驅(網盤中提供)加載iso文件,在統中找到matlab2014安裝目錄,里面有兩個子目錄,Win32和Win64。找到Win32目錄以安裝32位的Matlab。
安裝時會提示存在64位版本。這里忽略提示,一直點擊下一步可安裝到結束。程序安裝需要較長時間。注意,在同一個Windows系統中允許同時存在W32版本和W64版本的Matlab。所以若你的系統是64位系統,則不必重新安裝操作系統。
二、應用程序與matlab的交互
首先先給出定義:將開發者的電腦叫做開發電腦,將最終程序將要運行的電腦叫做發布電腦,將開發者開發的程序叫做應用程序。在大多數情況下,開發電腦和發布電腦是不同的電腦平臺,其上安裝的軟件也不同。應用程序與matlab的交互大致有以下3種形式:
本拓展僅介紹第一種LPC調用方式。
首先找到matlab的對外接口的目錄:在matlab的安裝目錄下可以找到對外接口目錄:
其中Include目錄是C語言的接口頭文件。Lib目錄是matlab與C接口的庫文件。進入lib可以發現有32位和64位兩種方式,我們現在使用的C編譯器是VC6.0,是生成32位系統的,因此這里庫文件要注意只能連接32位目錄下的庫。反之,若使用高版本的VC,例如VS2014,則可以編譯64位應用程序,這時候就應該選擇對應的庫文件。
三、使用VC++編寫應用程序在線調用matlab
工程路徑設置
在WinLearn中創建新的項目,項目名叫做WinStep6。由于僅僅測試調用matlab功能,因此不用建立Win32 Application,建立我們學習C語言時所習慣的Win32 Console Application即可。按照C語言習慣,選擇空工程。
工程建好以后,需要對系統路徑做一些設置。在Tools菜單中選擇Options。然后在選項卡中找到Directorys:
首先確定是設置包含文件(include)目錄。然后點擊新建按鈕,創建一行新的包含文件路徑。出現編輯框后,點擊右邊的…按鈕如圖上的(1)步驟。
出現右邊的“選擇目錄”對話框后,先點擊地下的Drive,選擇matlab的安裝后的所在磁盤號。如果前面都是選擇默認安裝,這里應該是C盤。然后在從路徑中找到matlab的外部支持的include目錄。如上圖3.選擇好目錄后點擊OK使設置生效。
然后需要設置庫文件所在目錄。類似包含文件目錄的設置,這里要選擇library files。如下圖。注意在lib中要選擇Win32,再選microsoft。因為你現在編寫的應用程序是microsoft公司的VC++6.0。若你用其他公司的C編譯器,則選擇對應的路徑。
打開和關閉matlab
在剛才的空工程文件中,新建一個源文件,main.c。在頭文件位置包含”engine.h”。并使用#pragma命令將libeng.lib包含到工程里。代碼如下:
其中幾處需要注意的地方:
a. 第一個包含文件是windows.h,對于本例并不需要,但是后面的繼續內容可能需要此頭文件。
b. <stdio.h>提供了printf函數的聲明
c. <stdlib.h>提供了exit函數的聲明
d. <tchar.h>提供了UNICODE和ASC兩種模式下中文字符的輸入和輸出的兼容性。下面代碼中的printf前面冠以_t和字符串冠以_T( ),用于兩種編碼方式的兼容性。
e. <engine.h>不是VC提供的頭文件,位于Matlab的安裝目錄下。
但是因為在前面的操作中已經將其添加到VC的包含文件的目錄里面,因此可以將其當做系統頭文件來用。
f. #pragma是微軟公司特有的預處理命令,這里表示將使用到libeng.lib庫。后面會根據matlab的調用的功能,增加新的庫連接。
g. engOpen和engClose是成對使用。前者打開matlab,若是第一次打開,將會等待一段時間。并且matlab會打開一個小窗口。
h. 在跨架構(例如在64位操作系統上運行32位matlab或者操作系統中同時存在兩個以上matlab版本)或者系統經常安裝卸載程序時,上述程序有可能不能正常運行。一種常見的錯誤信息如下:
若遇到此錯誤,需要按照下面的步驟在系統中添加32位matlab的執行路徑:
點出編輯界面后,選添加再選瀏覽,找到C盤下的matlab安裝路徑再找到bin下的win32,點擊確定后關閉編輯界面保存。如有必要重啟電腦即可。
程序正確運行時,會彈出一個matlab命令窗口:隨版本不同輸出信息各不相同。
向matlab傳遞變量:
Matlab中變量即數組,哪怕是一個變量也是以數組形式保存的。C語言使用mxArray類型和matlab數組進行交互。要使用mxArray,需要在頭文件里包含mxlib.h,并且需要連接libmx.lib庫。代碼如下:
其中幾處需要注意的地方:
a. 頭文件增加了matrix.h
b. 庫文件增加了libmx.lib
c. 主要matlab的代碼是s=randperm(n);表示將1~n的整數亂序(洗牌)這里的n值將由應用程序傳入,而s將傳出給應用程序。從示例代碼中可以發現傳入參數是一個普通字符串,如果需要,可以先由用戶輸入或者程序中生成有效的matlab代碼,然后在這里傳入。
d. C語言和Matlab引擎的數據通道是mxArray,用來傳入數據和傳出數據。
e. mxArray支持復雜的數據類型,可以搜索mxCreateXXXXMatrix的函數簇。這里用mxCreateDoubleMatrix演示了雙精度浮點數。其前兩個參數1,1表示是1*1的矩陣,是一個簡單的變量。類似于malloc,mxCreateXXXXMatrix內部將分配矩陣所需要的存儲空間,因此和應用程序使用的變量是兩個不同的空間。下面使用memcpy函數將應用程序的變量n值復制到mx的空間里。同樣,類似于malloc, mxCreateXXXXMatrix函數分配的內存,在使用完畢后要使用mxDestroyArray函數釋放。
f. 使用engPutVariable將mx變量(矩陣也是一種變量)放置到matlab工作區間內。其中第二個參數是變量名,第三個參數是mx矩陣。
使用engGetVariable可以將變量從matlab中取出存放到mx變量空間。該函數返回一個mxArray數據,可以通過mxGetPr獲得這個mxArray內存地址。由于Matlab默認都是double類型,因此可以將指針賦給pRes指針。
g. 使用mxGetN獲得矩陣的列,使用mxGetM獲得矩陣的行。(在matlab中矩陣是按照先行后列的方式保存的。)
h. 區分一下:pIn是由mxCreateXXXX函數簇創建的,因此需要mxDestroyMatrix釋放內存;而pOut是由engGetVariable獲得的,因此不需要mxDestroyMatrix。在最后由engClose關閉時自動釋放內存。
總結
以上是生活随笔為你收集整理的Windows编程之调用Matlab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows编程之多媒体
- 下一篇: 保护文化遗产宣传标语文案28句