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