




已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2部分 實(shí)戰(zhàn)練習(xí)(自己做的)2.1 c#調(diào)用matlab函數(shù)matlab版本2009b,c#版本vs200 matlab函數(shù)編譯成dll文件(1)首先編寫一個(gè)函數(shù)的m文件,如MatrixOpera表示兩個(gè)矩陣相加和相減。%-function addRlt,minusRlt=MatrixOpera(a,b)% 矩陣相加,相減m1,n1=size(a);m2,n2=size(b);if m1=m2 | n1=n2 display(矩陣大小不相同) error(參數(shù)錯(cuò)誤);endaddRlt=a+b;minusRlt=a-b;end%-兩個(gè)輸入?yún)?shù),兩個(gè)輸出參數(shù),并且都是矩陣形式(2)在matlab 命令窗口輸入deploytool,彈出如下窗口或者點(diǎn)擊matlab的主菜單 desktopdeploy tool獲得如下面圖所示的窗口,然后在filenewdeployment project 中點(diǎn)擊。獲得上圖窗口,修改工程名稱和文件后綴名(必須是,.Net Assembly格式)修改(3)新建了一個(gè)叫matPrj的工程(它相當(dāng)于c#中的命名空間namespace);然后給它增加class或類(它就是c#中的類),點(diǎn)add class比如myMathClass;之后再給它添加方法(它就是函數(shù)了),點(diǎn)add files,如下圖所示。本實(shí)例中給它添加了MatrixOpera等函數(shù)。方法class(4)完了之后就可以編譯了。編譯出來(lái)后需要一兩分鐘的時(shí)間。編譯(5)找到該工程存放的文件夾,從里面拷出matPrj.dll文件。同時(shí)還要從G:Program FilesMATLABR2009btoolboxdotnetbuilderbinwin32v2.0拷貝出MWArray.dll和ManagedCPPAPI.netmodule。第二個(gè)文件必須要哦,否則可能會(huì)出錯(cuò)。2.1.2 c#添加matlab的dll引用(1)打開(kāi)vs2008,新建一個(gè)窗體應(yīng)用程序。(2)將剛才拷貝到的那3個(gè)文件一起放在vs工程(CallMatlabDllApp)的debug文件夾下面。然后右鍵下圖中的引用,選擇添加引用,彈出一個(gè)窗口,選擇其中的瀏覽頁(yè)面,分別添加matPrj.dll文件和MWArray.dll文件。已經(jīng)添加了的引用右鍵,點(diǎn)添加引用(3)最后在前面,代碼的前面添加下面的命名空間即可。using MathWorks.MATLAB.NET.Arrays;/在MWArray.dll,最常用的using MathWorks.MATLAB.NET.Utility;/ 在MWArray.dll,最常用的using matPrj;/這個(gè)就是我們自己定義的,里面有matlab函數(shù)如果matlab函數(shù)復(fù)雜,還需要用到其他的空間,則視情況而定,自己憑經(jīng)驗(yàn)添加。已經(jīng)添加了的引用至此,已經(jīng)可以利用c#調(diào)用我們用matlab編寫的函數(shù)了。2.1.3 函數(shù)調(diào)用函數(shù)調(diào)用前必須注意:(1)將c#的參數(shù)輸入到matlab函數(shù)時(shí),要將參數(shù)轉(zhuǎn)化為matlab的參數(shù)形式,通常是MWArray類型。(2)matlab返回的參數(shù),也要轉(zhuǎn)化為c#用的類型,比如數(shù)組或者數(shù)值類型。下面是關(guān)于(1)和(2)的介紹,從別人那拷過(guò)來(lái)的,具體可參考/share/detail/294982直接將值傳遞給已經(jīng)初始化的MWArray數(shù)組中的成員直接將數(shù)據(jù)類型賦值給已經(jīng)初始化的MWNumericArray變量。直接將字符串類賦值給已經(jīng)初始化的MWCharArray變量。如果是數(shù)組類型:直接賦值給MWNumericArray變量;賦值給MWArray變量,則在前面加上類型轉(zhuǎn)換如:(MWNumericArray)進(jìn)行強(qiáng)制轉(zhuǎn)換??傊?,MWArray是總類型,其它的以MW開(kāi)頭,以Array結(jié)尾的變量類型都可以直接對(duì)它進(jìn)行賦值或取值。M類型到C+/C#數(shù)據(jù)類型MWArrayM類型,它是M文件的編譯后內(nèi)部的標(biāo)準(zhǔn)類型,一切C+/C#類型都要最終轉(zhuǎn)換成此類型,方可作為參數(shù)調(diào)用M語(yǔ)言函數(shù)。MWCharArrayM的字符串類型,使用它可以將M中的字符類型轉(zhuǎn)換成C+/C#的字符串類型。MWNumericArrayMWNumericArray是MWArray與C#等語(yǔ)言的轉(zhuǎn)換中間類型。常用的轉(zhuǎn)換函數(shù): public Array ToArray(MWArrayComponent component);將M類型轉(zhuǎn)換成C#的Array類型,然后可以直接轉(zhuǎn)換成其它類型的數(shù)組。public byte ToScalarByte();將M類型轉(zhuǎn)換成C#的字節(jié)類型;public double ToScalarDouble();將M類型轉(zhuǎn)換成C#的雙精度類型;double temp = (MWNumericArray)(mwArgout0).ToScalarDouble();public float ToScalarFloat();將M類型轉(zhuǎn)換成C#的單精度類型;public int ToScalarInteger();將M類型轉(zhuǎn)換成C#的整型類型;public long ToScalarLong();將M類型轉(zhuǎn)換成C#的長(zhǎng)整C/C+/C#數(shù)據(jù)型類型;public short ToScalarShort();將M類型轉(zhuǎn)換成C#的短整型類型; public override string ToString();將M類型轉(zhuǎn)換成C#的字符串類型;string arror = mwArgout2.ToString(); public Array ToVector(MWArrayComponent component);將M類型轉(zhuǎn)換成C#的Array類型,然后可以直接轉(zhuǎn)換成其它類型的數(shù)組。下面使用調(diào)試過(guò)的代碼示例表述兩個(gè)函數(shù)的區(qū)別:double, Temp1 = new double1,3; Temp1= (double,)(MWNumericArray)mwArgout1).ToArray(MWArrayComponent.Real);double s1 = new double2; s1 = (double)(MWNumericArray)mwArgout1).ToVector(MWArrayComponent.Real);(3)必須注意到多參數(shù)輸入和多參數(shù)返回的問(wèn)題。剛開(kāi)始碰到這個(gè)這個(gè)問(wèn)題比較頭疼,后來(lái)經(jīng)過(guò)不懈的努力,終于從網(wǎng)上找到答案。聲明這部分是我參考別人的想法自己寫的額,網(wǎng)上百度知道也有我(lwq123_321)回答的。/輸入這里想傳入的2個(gè)輸入?yún)?shù),為了支持矩陣好通用,所以得弄成Array double a = 1, 2, 3, 4, 5, 6 ;/輸入?yún)?shù)1 double b = 2, 4, 6, 8, 10, 12 ;/輸入?yún)?shù)2 double, c = new double3, 2;/輸出參數(shù)1 double, d = new double3, 2;/輸出參數(shù)2/這些參數(shù)都是矩陣 MWNumericArray ma = new MWNumericArray(3, 2, a);/轉(zhuǎn)換成matlab需求的格式 MWNumericArray mb = new MWNumericArray(3, 2, b);/輸出參數(shù)是一個(gè)MWArray數(shù)組 MWArray agrsOut = new MWArray2;/兩個(gè)輸出參數(shù),一定要寫數(shù)量 /輸出幾個(gè)輸出參數(shù)可以是不同類型的,比如第一個(gè)元素是矩陣,第二個(gè)是數(shù)值 /同理,輸入?yún)?shù)也是一個(gè)MWArray數(shù)組 MWArray agrsIn = new MWArray ma,mb;/調(diào)用函數(shù),輸出參數(shù)需要加 ref 關(guān)鍵字 myFun.MatrixOpera(2, ref agrsOut, agrsIn); /2表示輸入?yún)?shù)的個(gè)數(shù),輸出結(jié)構(gòu)都在argsOut中,類似于c的指針參數(shù)輸入/轉(zhuǎn)換得到實(shí)際的輸出參數(shù) MWNumericArray x1 = agrsOut0 as MWNumericArray; MWNumericArray x2 = agrsOut1 as MWNumericArray; c = (double,)x1.ToArray(); d = (double,)x2.ToArray();/一定要注意最后c和d的轉(zhuǎn)化,不同類型的轉(zhuǎn)換差異很大厄/ToArray()對(duì)應(yīng)n*m的數(shù)組/ToScalarDouble()對(duì)應(yīng)單個(gè)數(shù)值/ToVetor()對(duì)應(yīng)1維數(shù)組到此,已經(jīng)實(shí)現(xiàn)了c#調(diào)用matlab函數(shù)的整個(gè)過(guò)程。第1部分 他山之石可以攻玉(別人的經(jīng)驗(yàn)收集)1.1 matlab與c#接口的實(shí)現(xiàn)/lemonfamily/article/details/1497527發(fā)現(xiàn)博客里上傳圖片特別的麻煩,以后可能就不再傳什么圖片上來(lái)了,都放到相冊(cè)里實(shí)在浪費(fèi)空間。一直以來(lái),各系統(tǒng)之間如何實(shí)現(xiàn)互相通信都是非常重要也是最難解決的問(wèn)題,同時(shí)也是關(guān)系到一個(gè)系統(tǒng)設(shè)計(jì)成敗的關(guān)鍵。我們這里所說(shuō)的接口,也就是系統(tǒng)與系統(tǒng)間交互的中間媒介或者說(shuō)是數(shù)據(jù)轉(zhuǎn)換器。關(guān)于matlab與c#之間一些數(shù)據(jù)類型的轉(zhuǎn)換的方法,我也曾經(jīng)寫過(guò)。總結(jié)一下,最主要的是要完成下面幾個(gè)步驟:1、同時(shí)安裝.netframwork與MCR(matlab compile runtime)。這個(gè)在裝完與matlab以后,前面2個(gè)組件也就安裝好了。2、利用matlab自帶的.nettool工具將.m文件轉(zhuǎn)換成.net組件-.dll文件為接口,它實(shí)際上不含任何實(shí)現(xiàn),都是調(diào)用另一個(gè).ctf文件來(lái)完成具體的功能。3、在c#中,必須引入mwarray.dll才能擁有在.net中進(jìn)行矩陣運(yùn)算所需要的一切。雖然matlab help中只是說(shuō)推薦,但一般的應(yīng)用中,只是進(jìn)行一部分函數(shù)的調(diào)用,而不是去取得整個(gè)運(yùn)行結(jié)果。這個(gè).dll是必須引入的。有時(shí)mclmcrrt74.dll這個(gè)文件也需要引入。根據(jù)具體的要求,需要引入的文件也有所差別。4、生成一個(gè)實(shí)例,并對(duì).net組件所輸出的結(jié)果進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換,以符合.net編程環(huán)境中對(duì)數(shù)據(jù)類型的要求,這個(gè)在以前我已經(jīng)講過(guò),這里就不再多說(shuō)了。關(guān)鍵是掌握如何把一個(gè)矩陣(在matlab中,一個(gè)m*n的矩陣對(duì)應(yīng).net中的一個(gè)1*(m*n)的數(shù)組)轉(zhuǎn)換成數(shù)據(jù)類型一致的數(shù)組。目前所有的matlab數(shù)據(jù)類型(無(wú)論什么類型,都可以把它看成一個(gè)矩陣,這樣就可以利用數(shù)組的思想來(lái)思考)都可以進(jìn)行轉(zhuǎn)化,具體的可能需要經(jīng)過(guò)實(shí)驗(yàn)才能符合各自的要求。雖然matab對(duì).net的支持不如它對(duì)c+支持的功能強(qiáng)大,但也已經(jīng)滿足了我們實(shí)際應(yīng)用的需求。如果我們可以把大部分的運(yùn)算都放在matlab里面完成,數(shù)據(jù)轉(zhuǎn)換的數(shù)量又少,那么整個(gè)系統(tǒng)的運(yùn)行速度與效率還是挺高的。1.2 關(guān)于matlab與c#混合編程產(chǎn)生的移植問(wèn)題/lemonfamily/article/details/1497528這個(gè)問(wèn)題曾經(jīng)差點(diǎn)讓我的畢業(yè)設(shè)計(jì)的程序沒(méi)辦法拿出去演示。其實(shí)這也是個(gè)很現(xiàn)實(shí)的問(wèn)題,你做好的程序如果不能在別人的機(jī)子上運(yùn)行,那么它有什么應(yīng)用價(jià)值呢?說(shuō)來(lái)也慚愧,我以前編寫過(guò)很多的程序都出現(xiàn)過(guò)移植性難的問(wèn)題。我想一個(gè)很主要的原因是在一個(gè)程序開(kāi)發(fā)者使用的機(jī)子上,往往是具備了非常完整的軟件運(yùn)行環(huán)境,但程序運(yùn)行時(shí)有可能需要調(diào)用外部的程序或函數(shù),這些平時(shí)我們可能不會(huì)去注意。也就造成軟件發(fā)布時(shí)移植性問(wèn)題產(chǎn)生的根源了。matlab與c#混合編程的程序,如果要運(yùn)行于客戶的機(jī)子,必須在客戶端的機(jī)子上設(shè)置好系統(tǒng)變量,同時(shí)需要安裝.netframwork與MCR。.netframwork大家都很熟悉了,任何一個(gè).net設(shè)計(jì)出來(lái)的程序,都不能脫離.netframwork而獨(dú)立運(yùn)行,正如用vc+設(shè)計(jì)的程序離不開(kāi)MFC一樣。這個(gè)是必須安裝的。獨(dú)立的.netframwork組件包可以直接去微軟的網(wǎng)站上去找。MCR是由matlab提供的,它和.netframwork的性質(zhì)相同,任何一個(gè)運(yùn)行matlab的電腦上,都必須安裝該組件。該組件在matlab2006a版本中已經(jīng)分離開(kāi)而成為一個(gè)獨(dú)立的可運(yùn)行的.exe文件。它一般是放在 /MATLAB/R2006a/toolbox/compiler/deploy/win32文件夾中,名為 MCRInstaller.exe。該組件其實(shí)是將/MATLAB/R2006a/bin/win32文件夾下的大部分(注意不是全部).dll文件打包而已。這也是為什么有些程序在安裝了MCR的機(jī)子上仍然不能運(yùn)行的原因,不過(guò)對(duì)絕大多數(shù)的程序來(lái)說(shuō),一個(gè)MCR就足夠了。比較保險(xiǎn)的辦法是,自行將/MATLAB/R2006a/bin/win32下的所有文件打包成一個(gè)安裝文件,安裝完后設(shè)置好系統(tǒng)變量(也就是在class變量下添加上面文件的路徑)。為了讓用戶安裝程序時(shí)不需要太多的操作,我們可以把上面2個(gè)組件和應(yīng)用程序一起打包,然后寫個(gè)腳本檢測(cè)客戶端的機(jī)子是否已經(jīng)安裝了上面的2個(gè)組件,如果沒(méi)有,則提示用戶安裝。檢測(cè)腳本的寫法很多地方都可以找到。這里就不多介紹了。1.3 使用轉(zhuǎn)換心得1.3.1 使用把matlab的dll放到bin或者應(yīng)用程序目錄里,添加項(xiàng)目引用. 然后參考該類庫(kù)的文檔,在類里引用matlab的命名空間 裝matlab ,添加引用VB。Net Matlab = CreateObject(matlab.application) MatLab.MinimizeCommandWindow() strMatLab = t=2:0.2:4*pi;y=sin(t);plot(t,y) /這只不過(guò)是一個(gè)例子,求特征值的string要自己查 MatLab.Execute(strMatLab) /t/20040621/19/3111008.html1.3.2 矩陣轉(zhuǎn)換示例 用于將matlab的返回值矩陣傳遞到C#規(guī)范的矩陣中 MWArray ResOut = null; /用于值輸出的matlab矩陣 ResOut=GTN.GetMatchNo(1,MainAdd, ModelAdd, FName.GTM(), Vaval); MWNumericArray temp = (MWNumericArray)ResOut0; /矩陣轉(zhuǎn)換 Array netInterfaceMatrix = temp.ToArray(MWArrayComponent.Real); /c#規(guī)范的矩陣 double, location = (double,)netInterfaceMatrix; /變態(tài)的強(qiáng)制類型轉(zhuǎn)換 http:/
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年臨床護(hù)理環(huán)境試題及答案分析
- 探索中國(guó)文化的試題及答案解讀
- 考試準(zhǔn)備心理建設(shè)執(zhí)業(yè)醫(yī)師考試試題及答案
- 藥物生物等效性分析試題及答案2025
- 行政管理專業(yè)的語(yǔ)文備考策略與試題答案
- 成本控制風(fēng)險(xiǎn)評(píng)估
- 2025年護(hù)士實(shí)踐題目及答案總結(jié)
- 臨床決策支持系統(tǒng)的重要性試題及答案
- 精通行政事務(wù)的試題及答案
- 2025年衛(wèi)生資格考試必考內(nèi)容與試題答案
- HDI盲孔的可靠性設(shè)計(jì)分析
- 2022年四川綿竹高發(fā)投資有限公司招聘筆試題庫(kù)及答案解析
- 北京中考英語(yǔ)詞匯表(1600詞匯)
- 籃球比賽計(jì)分表word版
- 上古卷軸5所有任務(wù)代碼
- 固體制劑批包裝記錄模版
- 2000年40個(gè)部門投入產(chǎn)出表
- 高空作業(yè)安全會(huì)議記錄內(nèi)容
- 00510秘書實(shí)務(wù)-自考整合版
- 護(hù)理研究中的偏倚及控制
- 小學(xué)生的齲齒預(yù)防ppt課件
評(píng)論
0/150
提交評(píng)論