日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows编程之调用Matlab

發(fā)布時(shí)間:2023/12/2 windows 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows编程之调用Matlab 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、選擇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種形式:

  • 同時(shí)打開應(yīng)用和Matlab,在應(yīng)用程序中動(dòng)態(tài)調(diào)用matlab的接口,將計(jì)算任務(wù)交給matlab執(zhí)行,執(zhí)行完畢后將結(jié)果返回給應(yīng)用程序。這種方式需要在發(fā)布電腦上安裝完整版的matlab,而且應(yīng)用程序第一次調(diào)用matlab模塊時(shí)需要啟動(dòng)matlab,會(huì)有較大的延時(shí)。總的來說,這種方式叫做遠(yuǎn)程進(jìn)程調(diào)用(Remote Process Call ,RPC調(diào)用)。由于應(yīng)用程序和被調(diào)用的matlab都在同一臺(tái)發(fā)布電腦上,因此這種調(diào)用方式又被稱為本地進(jìn)程調(diào)用(LPC,Local Process Call)。
  • 使用matlab將應(yīng)用程序所需要的模塊編譯成小的授權(quán)發(fā)布模塊。這樣應(yīng)用程序執(zhí)行時(shí)不需要啟動(dòng)整個(gè)matlab,只需要啟動(dòng)這個(gè)授權(quán)發(fā)布的模塊即可。顯然這種方式最大的優(yōu)點(diǎn)是matlab 是安裝在開發(fā)電腦上的,發(fā)布電腦不需要完整的matlab,只需要開發(fā)者向matlab購買一個(gè)發(fā)布授權(quán)即可——當(dāng)然破解版不在討論之列。此外由于發(fā)布電腦上安裝的是輕量級(jí)Matlab,因此啟動(dòng)和資源消耗都比較少。這種模式的缺點(diǎn)也是很明顯的。由于發(fā)布電腦上一般沒有命令解釋模塊,因此應(yīng)用程序的靈活性被降低了,只能執(zhí)行事先編譯好的matlab代碼。這種調(diào)用方式叫做嵌入式matlab模塊(embedded matlab module)
  • 編寫可以被matlab調(diào)用的應(yīng)用程序模塊。應(yīng)用程序僅僅提供模塊而是否調(diào)用,如何調(diào)用,由matlab決定。這種調(diào)用方式叫做mex編程。應(yīng)用程序不用編寫main函數(shù),僅僅向matlab提供被調(diào)用代碼。這種方式顯然在發(fā)布電腦上需要安裝完整版的matlab。使用應(yīng)用程序來補(bǔ)充matlab的不足,這是一種面向matlab 的解決方案。
  • 本拓展僅介紹第一種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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。