熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Matlab與C#連接的幾種方式比較

2013-11-13 09:49:44  來源: .NET編程 

  使用環境 Visual Studio Matlab a

  前提機器要裝好MCR(很變態MB~MB因版本而異)否則會編譯出錯

  COM

  步驟

  matlab編譯工作

   mbuild setup

   deploytoolMatlab Builder Generic COM Component

   添加m函數文件(eg: myfuncm)改類名(eg: myComClass)build

  注冊dll

  regsvr myComdll

  regsvr mwcomutildll

  VS調用

   Reference加Com控件

   調用示例

  double[] arr = null;

  object in_a out_a;

  in_a = ;

  out_a = arr;

  myCommyComClass mc = new myCommyComClass();

  mcmyfunc( ref out_a in_a);

  注

   如果報錯且報錯中有亂碼請自己打開log看個究竟log裡面可顯示出中文

   VS必須裝上VC否則找不到Midl這個文件就編譯不了com

  (參見Matlab Builder 的幫助有源代碼)

  matlab a版本之後提供此連接方式

  步驟

  matlab編譯工作

   mbuild setup

   deploytoolMatlab Builder NET Component

   添加m函數文件(eg: myfuncm)改類名(eg: myClass)build

  VS調用

   Reference要有MWArray(%matlabpath%\toolbox\dotnetbuilder\bin\win\v)和build出來的DLL

   使用名空間

  using MathWorksMATLABNETUtility;

  using MathWorksMATLABNETArrays;

  using dll名;

   MWNumericArray是MWArray和c#中數據的中間類怎麼用?怎樣在C#與matlab間傳遞參數?

  adouble型int型等數值類型的變量傳遞

  MWNumericArray i = null result = mydouble;

  i=;

  myClass myclass = new myClass(); //實例化

  result = (MWNumericArray)myclassmyfunc(i);

  b字符串(需要用到MWCharArray和MWArray轉換)

  MWCharArray FileName = myString;

  MWNumericArray sensitivity;

  sensitivity = (MWNumericArray)myClassmyAlgorithm((MWArray)FileName);

  c多個輸出參數組成的數組

  MWNumericArray out_Arr = (MWNumericArray)out_Args[]; //取出第一個參數返回的數組(matlab返回的數組下界是從開始的)

  取出數組中的一個元素值

  mydouble=out_Arr[i]ToScalarDouble();

  如上面例子ToScalarDouble一類的toXXXX等方法還有許多慢慢發掘吧

  dresulttoArray可以把matlab返回的矩陣變成C#的n x m數組eg:

  double[] csArray= (double[])resultToArray(MWArrayComponentReal);

  e將數組傳入Matlab(和傳遞單個數值的方法一樣) //日添加

  double[] dbx = new double[ ] { { } { } };

  MWNumericArray x=dbx;

  myclasspicture(x);

  其中picture是一個自己寫的m函數內容是plot(x)用於驗證傳入的矩陣的結果結果如下圖:

  

  時間CPU內存開銷比較

  時間是這樣算得的

  DateTime tst = DateTimeNow;

  

  DateTime tst = DateTimeNow;

  TimeSpan dift = tst tst;

  MatlabC#內存/虛擬內存開銷(MByte)

  

  個magic()

  個magic()  

  個magic()

  無界面程序    M M

  時間測試(s)        NET   / COM

  Group

  實例化時間           

  第一次調magic()     

  第二次調magic()     

  傳遞x矩陣           未測

  Group

  實例化時間           

  第一次調magic()   

  第二次調magic()   

  傳遞x矩陣       未測

  Group

  實例化時間            未測

  第一次調magic()      未測

  第二次調sumab()    未測

  結論

   開機後第一次運行程序需要花s左右的時間實例化類之後實例化需要花費s的時間

   耗內存占時間的是將MCR實例化的過程!!

   最好在程序靠前位置把封裝的類實例化

   大矩陣的類型轉換要消耗一段時間但是和小矩陣比並不明顯如果數據量實在很大用文件傳遞參數也是一個解決辦法

   com模式和Net模式的調用相差不大但就編譯速度而的方式要快上很多而且似乎比較穩定(我的機器就是如此com編譯報錯編譯很快就通過了而且用得不錯)

   早期版本的MCR庫較小估計能快一些

   有的機器無法編譯Com可能是Windows XP缺乏補丁據說番茄花園等版本系統的一些服務被優化掉了也不能夠正常編譯

   更新matlab程序將dll復制到相應文件夾後應該刪除文件夾下的(dll名字)_mcr文件夾否則程序在載入dll時可能出現異常

  

  調試經驗(日更新)

  由於matlab對輸入參數的處理非常靈活而C#在輸入輸出上十分嚴格因此常會出現轉換數據類型出錯的問題

  解決方法是把C#接口的輸入輸出看牢Matlab函數的輸入參數最好為double型不要double和float混雜否則輸出可能有些是float有些是double

  

  關於數據接口的兩種處理方法(日更新)

  上面的時間測試表格給出的是值傳遞方法消耗的時間實際使用中發現傳遞參數很多時值傳遞法需要消耗大量時間因此又提出了通過文件傳遞參數或結果的方法以下是在上述兩種方法下運算與返回數據消耗的時間評估

  時間測試(s)         值傳遞   / 文件

  Group

  實例化時間           

  第一次調magic()     

  第二次調magic()   

  傳遞x矩陣       (無法測出)

  由於文件傳遞x的整形矩陣時間太短無法測出故改為x以評估其時間消耗時間為:


From:http://tw.wingwit.com/Article/program/net/201311/11689.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.