c#

位置:IT落伍者 >> c# >> 浏览文章

Matlab与C#连接的几种方式比较


发布日期:2019年10月04日
 
Matlab与C#连接的几种方式比较

使用环境 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以评估其时间消耗时间为:

               

上一篇:C#调用QTP自动化对象模型的实例

下一篇:深入浅出分析C#接口的作用