知识大全 Matlab与C#连接的几种方式比较
Posted 时间
篇首语:花门楼前见秋草,岂能贫贱相看老。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Matlab与C#连接的几种方式比较相关的知识,希望对你有一定的参考价值。
Matlab与C#连接的几种方式比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
使用环境 Visual Studio Matlab a
前提 机器要装好MCR(很变态 MB~ MB因版本而异) 否则会编译出错
步骤
matlab编译工作
mbuild setup
deploytool Matlab Builder Generic Component
添加m函数文件(eg: myfunc m) 改类名(eg: myComClass) build
注册dll
regsvr myCom dll
regsvr mwutil dll
VS 调用
Reference加Com控件
调用示例
double[ ] arr = null;
object in_a out_a;
in_a = ;
out_a = arr ;
myCom myComClass mc = new myCom myComClass();
mc myfunc( ref out_a in_a);
注
如果报错 且报错中有乱码 请自己打开log看个究竟 log里面可显示出中文
VS 必须装上VC 否则找不到Midl这个文件 就编译不了
(参见Matlab Builder 的帮助 有源代码)
matlab a版本之后提供此连接方式
步骤
matlab编译工作
mbuild setup
deploytool Matlab Builder NET Component
添加m函数文件(eg: myfunc m) 改类名(eg: myClass) build
VS 调用
Reference要有MWArray(%matlabpath%\\toolbox\\dotnetbuilder\\bin\\win \\v )和build出来的DLL
使用名空间
using MathWorks MATLAB NET Utility;
using MathWorks MATLAB NET Arrays;
using dll名;
MWNumericArray是MWArray和c#中数据的中间类 怎么用?怎样在C#与matlab间传递参数?
a double型 int型等数值类型的变量传递
MWNumericArray i = null result = mydouble;
i= ;
myClass myclass = new myClass(); //实例化
result = (MWNumericArray)myclass myfunc(i);
b 字符串(需要用到MWCharArray和MWArray转换)
MWCharArray FileName = myString;
MWNumericArray sensitivity;
sensitivity = (MWNumericArray)myClass myAlgorithm((MWArray)FileName);
c 多个输出参数组成的数组
MWNumericArray out_Arr = (MWNumericArray)out_Args[ ]; //取出第一个参数返回的数组(matlab返回的数组下界是从 开始的)
取出数组中的一个元素值
mydouble=out_Arr[i] ToScalarDouble();
如上面例子ToScalarDouble一类的toXXXX等方法还有许多 慢慢发掘吧
d result toArray可以把matlab返回的矩阵变成C#的n x m数组 eg:
double[ ] csArray= (double[ ])result ToArray(MWArrayComponent Real);
e 将数组传入Matlab(和传递单个数值的方法一样) // 月 日添加
double[ ] dbx = new double[ ] ;
MWNumericArray x=dbx;
myclass picture(x);
其中picture是一个自己写的m函数 内容是plot(x) 用于验证传入的矩阵的结果 结果如下图:
时间 CPU 内存开销比较
时间是这样算得的
DateTime tst = DateTime Now;
DateTime tst = DateTime Now;
TimeSpan dift = tst tst ;
Matlab C#内存/虚拟内存开销(MByte)
个magic( )
个magic( )
个magic( )
无界面程序 M M
时间测试(s) NET /
Group
实例化时间
第一次调magic( )
第二次调magic( )
传递 x 矩阵 未测
Group
实例化时间
第一次调magic( )
第二次调magic( )
传递 x 矩阵 未测
Group
实例化时间 未测
第一次调magic( ) 未测
第二次调sumab( ) 未测
结论
开机后第一次运行程序 需要花 s左右的时间实例化类 之后实例化需要花费 s的时间
耗内存 占时间的是将MCR实例化的过程!!
最好在程序靠前位置把封装的类实例化
大矩阵的类型转换要消耗一段时间 但是和小矩阵比并不明显 如果数据量实在很大 用文件传递参数也是一个解决办法
模式和 Net模式的调用相差不大 但就编译速度而的方式要快上很多 而且似乎比较稳定 (我的机器就是如此 编译报错编译很快就通过了 而且用得不错)
早期版本的MCR库较小 估计能快一些
有的机器无法编译Com 可能是Windows XP缺乏补丁 据说 番茄花园 等版本系统的一些服务被 优化 掉了 也不能够正常编译
更新matlab程序 将dll复制到相应文件夹后 应该删除文件夹下的(dll名字)_mcr文件夹 否则程序在载入dll时可能出现异常
调试经验( 年 月 日更新)
由于matlab对输入参数的处理非常灵活 而C#在输入输出上十分严格 因此常会出现转换数据类型出错的问题
解决方法是把C#接口的输入输出看牢 Matlab函数的输入参数最好为double型 不要double和float混杂 否则输出可能有些是float有些是double
关于数据接口的两种处理方法( 年 月 日更新)
上面的时间测试表格给出的是值传递方法消耗的时间 实际使用中发现传递参数很多时 值传递法需要消耗大量时间 因此又提出了通过文件传递参数或结果的方法 以下是在上述两种方法下 运算与返回数据消耗的时间评估
时间测试(s) 值传递 / 文件
Group
实例化时间
第一次调magic( )
第二次调magic( )
传递 x 矩阵 (无法测出)
cha138/Article/program/net/201311/11689相关参考
Java项目中连接数据库的几种方式和范例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最原始的
使用该财务指标时的几种方式一般的投资者在使用该财务指标时有以下几种方式:一、通过每股收益指标排序,用来区分所谓的“绩优股”和“垃圾股”;二、横向比较同行业的每股收益来选择龙头企业;三、纵向比较个股的每
C#调用JS的几种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 今天用到PageRegis
C#启动外部程序的几种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 启动外部程序不等待其退
C#中路径的几种获取方法及其区别 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! stringst
C#编程中的New关键词的几种用法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb
C#编程中的New关键词的几种用法[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 前段时间
C#编程中的New关键词的几种用法[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!newpub
C#编程中的New关键词的几种用法[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 以下是引
最近经常看到论坛中许多帖子询问如何使用split来分割字符串我这里对split做一些简单的总结希望能够对大家有所帮助下面介绍几种方法 第一种方法打开新建一个控制台项目然后在Main()方法下输入