国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#與MATLAB混合編程

2019-11-17 02:28:13
字體:
來源:轉載
供稿:網友

C#與MATLAB混合編程

Posted on 2015-04-03 21:01 wsying 閱讀(...) 評論(...) 編輯 收藏

  C#和MatLab的混合編程,充分利用了winform的直觀顯示和matlab的強大計算能力。在此以一個小例子的形式給大家講述一下二者混合編程的實現。

  

  一、軟件的配置說明

  C#版本:VS2010 matlab版本:matlab2013a

  二、把 matlab函數編譯成dll文件 

  2.1首先寫一個函數的.m文件(如下函數MatrixOpera實現兩個矩陣的相加和相減)

%--------------------------------------------------------function [addRlt,minusRlt]=MatrixOpera(a,b)% 矩陣相加,相減[m1,n1]=size(a);[m2,n2]=size(b);if m1~=m2 || n1~=n2    display('矩陣大小不相同')    error('參數錯誤');endaddRlt=a+b;minusRlt=a-b;end%-----------------------------------------------------------

 

  2.2 創建制作的dll文件的工程

  在MatLab的命令窗口中,輸入deploytool打開創建dll文件的工程創建窗口,如下圖所示

  

  在圖中,主要分為三部分,Name:你想要命的工程名,PRj是工程的后綴;Location:創建工程的儲存位置;Type:針對c#而言,我們需要選擇.NET Assembly這一項

  點擊Ok選項,工程已經創建完畢

  2.3 向所建工程中添加對應的元素并編譯

  上述過程中,新建了一個叫matPrj的工程(它相當于c#中的命名空間namespace);然后給它增加class(它就是c#中的類),點[add class]添加myMathClass;之后再給它添加方法(它就是函數了),點[add files],本實例中選中之前編寫的MatrixOpera函數。完了之后就可以編譯了,編譯需要一兩分鐘的時間,如下圖所示

  

  三、C#中添加matlab的dll引用

  3.1打開vs2010,新建一個窗體應用程序

  

  3.2完成dll文件的拷貝

  將matlab工程(matPrj)src文件夾下的matPrj.dll和D:/Program Files/MATLAB/R2013a/toolbox/dotnetbuilder/bin/win64/v2.0(前邊為matlab的安裝路徑)文件夾下的MWArray.dll拷貝到VS工程(CallMatlabDllApp)下的/bin/Debug文件夾下

  

  3.3在VS里添加dll文件的引用,然后在代碼前引用相應的命名空間

  

  

    

  

  如果matlab函數復雜,還需要用到其他的空間,則視情況而定,自己憑經驗添加。

  至此,已經可以利用c#調用我們用matlab編寫的函數了。

  四、在C#中調用matlab提供的函數

  matlab中一個m*n的矩陣對應.net中的一個1*(m*n)的數組,因此在C#中調用matlab函數的關鍵是掌握數據類型一致的一個矩陣與一個數組之間的轉換。包括以下兩個問題:

  a、將C#中的參數輸入到matlab函數時,要將參數轉化為matlab的參數形式,通常是MWArray類型

b、matlab函數返回的參數,也要轉化為C#用的類型,比如數組或者數值類型

  在C#中調用本例函數的代碼如下:

            matPrj.myMathClass test = new matPrj.myMathClass(); //將myMathClass類實例化            double[] a = { 1, 2, 3, 4, 5, 6 };//定義兩個輸入參數            double[] b = { 1, 1, 1, 1, 1, 1 };//它們是兩個一維靜態數組            double[,] c = new double[3, 2];//定義C#中接收輸出參數的類型            double[,] d = new double[3, 2];//是兩個二維數組            //把兩個輸入參數都轉換成中間類型,中間類型也是矩陣所以要指明維數            //這里將兩個輸入參數轉換為兩個三行兩列的矩陣            MWNumericArray matlab_a = new MWNumericArray(3, 2, a);            MWNumericArray matlab_b = new MWNumericArray(3, 2, b);            //輸入參數成功轉化為兩個MWArray元素類型            MWArray[] agrsIn = new MWArray[] { matlab_a, matlab_b };            //聲明輸出參數是兩個MWArray元素類型,一定要寫數量            MWArray[] agrsOut = new MWArray[2];            //調用matlab函數,2表示輸出參數的個數,輸出參數前需要加 ref 關鍵字            //此例實現了兩個三行兩列的矩陣相加減            test.MatrixOpera(2, ref agrsOut, agrsIn);            //把兩個輸出參數轉換成中間類型            MWNumericArray net_c = agrsOut[0] as MWNumericArray;//matlab函數第一個輸出參數            MWNumericArray net_d = agrsOut[1] as MWNumericArray;//第二個輸出參數       //轉換成C#中的接收參數            c = (double[,])net_c.ToArray();//轉化為二維數組            d = (double[,])net_d.ToArray();            //一定要注意最后接收參數的轉化,不同類型的接收參數用的轉換函數不同            //二維數組用ToArray()函數轉換            //一維數組用ToVector(MWArrayComponent.Real)函數轉換            //單個double值用ToScalarDouble()函數轉換       //單個int值用ToScalarInteger()函數轉換            for (int i = 0 ; i <= 2; i++)//輸出結果驗證            {                for (int j = 0; j <= 1; j++)                {                    textBox1.Text += c[i, j].ToString() + " ";                    textBox2.Text += d[i, j].ToString() + " ";                }                textBox1.Text += "/r/n";//換行                textBox2.Text += "/r/n";            }            

  MWNumericArray是MWArray與C#等語言數據轉換中間類,實現C#與matlab函數間傳遞參數的功能

  MWArray是總類型,其它的以MW開頭,以Array結尾的變量類型都可以直接對它進行賦值或取值,它是.m文件的編譯后內部的標準類型,一切C#類型都要最終轉換成此類型,方可作為參數調用matlab函數

  

  我在運行上述程序時,第一句將myMathClass類實例化報錯

  但是單看這語句是沒有任何問題的

  matPrj.myMathClass test = new matPrj.myMathClass();

  查閱了關于錯誤的信息,但是解決的都基本是換了一個matlab版本才解決的,偶然看見說HRESULT:0x8007000B的錯誤和編譯平臺有些關系,就開始著手試試是不是因為我這平臺的問題導致的,果然,換了編譯的平臺就好了。

  具體解決:

  1:右鍵項目名稱—>屬性—>生成

  2:目標平臺選擇x64(因為我的matlab2013a是64位的)

再次運行程序,結果如下:

上述結果同下圖在matlab中實現效果相同,驗證結果的正確性

  由于我的項目中其他引用是32位軟件生成的,為保重整個系統的各個模塊能同時工作,我重下了個32位的matlab2012a重新生成dll文件實現同樣的功能,C#項目程序不變,目標平臺改回x86(同時因為通常情況下,為保證我們的程序既能在64位機子上運行,也能在32位機子上運行,我們的目標平臺也會選擇x86),重復上述步驟進行操作,發現最后運行程序時再一次出現與之前相同的錯誤

  

  很明顯還是matlab版本的問題,但我的C#項目的目標平臺已經是x86,上網查找各種資料,有的說是因為matlab中被編譯的.m文件和編譯生成的工程所在路徑上有中文,改之,問題未解決;有的說要重現裝一下MCR(MATLAB Compiler Runtime),裝之,問題未解決;有人接著說裝完MCR后還要把他的路徑增加到環境變量path中,加之,問題未解決(后來發現這些做法根本就是多此一舉,系統安裝matlab時就已經安裝了MCR,而MCR在安裝成功后,路徑會被系統自動添加到環境變量中)。加上反反復復的安裝和卸載matlab共花費了大約2~3天的時間,問題仍然沒解決,正當我對人生充滿疑惑時,一次偶然的機會(直接運行打包后的程序),我看到了錯誤的信息是matlab引用與配置文件信息(2.13.0.0)不相符,我馬上找到了工程下的配置文件app.config,打開后果然發現里邊的配置信息有2.13.0.0的字眼,這很明顯是我最開始使用matlab2013a與C#混編時自動寫入的,而現在我換成了matlab2012a,與配置文件中的版本信息不相符,所以報錯,找到了問題所在,就容易解決了:把app.config中matlab版本信息2.13.0.0改成2.12.0.0,問題解決!

  脫離matlab安裝的環境下,如何實現程序的運行自如:

  通過com組建的形式進行混合編程,如果機器上沒有安裝MATLAB,編譯生成的軟件照樣可以使用,但是需要安裝MATLAB提供的MATLAB Compiler Runtime(MCR),這個軟件在MATLAB的安裝目錄下:X:/MATLAB/R2013a/toolbox/compiler/deploy/win32/MCRInstaller.exe(X是MATLAB安裝的盤符),如果你的電腦上安裝了MATLAB,則不需要在重新安裝這個軟件。另外,不同的MATLAB版本提供的MATLAB Compiler Runtime可能會不同,如果在另一臺電腦上自己編寫的軟件運行有問題,可能是編譯器的版本不同引起的

參考資料:http://wenku.baidu.com/link?url=mgBBgQFt89s-7rKrNbJ-630AH0q_2mMMYBbvCWx9IiGkuOQ7qFTkL_pZRhT5FqazmtFoD6UUM6vWLeDrprF2OAGqUcmrHEugVntjWvzCwxy

     http://m.survivalescaperooms.com/liuxiaowei0543/p/3682377.html

     http://wenku.baidu.com/view/6ad3b62b59eef8c75fbfb3ed.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 城固县| 应城市| 临猗县| 静宁县| 滨海县| 库尔勒市| 克拉玛依市| 郁南县| 和林格尔县| 图木舒克市| 洛阳市| 齐齐哈尔市| 绍兴县| 仲巴县| 荆门市| 辽中县| 达日县| 三穗县| 宜兴市| 油尖旺区| 平乐县| 乌兰察布市| 温泉县| 漳州市| 云阳县| 汶上县| 绍兴县| 镇平县| 昆明市| 定边县| 嵩明县| 芜湖市| 襄垣县| 鄂伦春自治旗| 乐昌市| 乃东县| 永胜县| 宿松县| 诸城市| 玛曲县| 吐鲁番市|