在数学分析工具方面,MATLAB无疑是佼佼者,除了作为软件工具外,MATLAB的自定义编程语言以及混合编程的支持,使其可以与Python、R之类数学分析语言媲美。尤其是在一些传统领域的研究,由于其研究领域的专业性,研究人员一般是该专业科班出身,而计算机则是副业,因此MATLAB的应用要远比Python和R广泛。

MATLAB拥有众多的算法包,.Net平台下的F#是用于数据分析的语言,但相比较而言,MATLAB的算法更多,计算效率更高,而且MATLAB的绘图能力很强;另一方面,MATLAB在传统的UI界面、程序功能控制、系统软件集成等方面略逊,因此将C# WinForm等与MATLAB结合起来,实现高效、便捷、集成的数学分析是一个很好的解决方案,而MATLAB的混合编程则可以支持该方案的实现。

MATLAB的混合编程,即将MATLAB平台(软件、计算引擎、DCOM服务、命令行接口等)与C#.Net等平台结合起来,分别负责某部分功能,相互传递数据和命令,共同实现数据分析。MATLAB与C#.Net实现混合编程的方式有两种,一种是将MATLAB脚本编译为.Net程序集(dll),然后C#.Net引用该程序集实现数据分析;另一种是C#调用MATLAB执行MATLAB脚本(m文件),也就是俗称使用MATLAB引擎的方式。

两种集成方式各有优缺点,例如编译为.Net程序集,受限于.Net程序集版本等,且需要编译后使用,不利于版本更新;直接调用MATLAB引擎,则需要安装MATLAB软件。选择何种集成模式,可根据具体需求、场景确定。网上有不少关于方案一的说明,本帖就方案二的实现做一概要说明。

MATLAB平台提供了DCOM服务、命令行接口两种接口方式,网上一般可以看到DCOM服务的方式,该方式可以直接将命令字符串传递给MATLAB实例(根据MATLAB类型反射创建MATLAB实例),使用其Excute方法执行代码,并可以获取到返回值。次方法调用时,MATLAB将DCOM服务提供给调用者,因此执行过程和结果MATLAB程序不反馈,最终将输出结果反馈给调用者。

System.Type oType = System.Type.GetTypeFromProgID("Matlab.Application");
object ostr = System.Activator.CreateInstance(oType);
object results = oType.InvokeMember("Execute", BindingFlags.InvokeMethod, null, ostr, new object[] { data });

上述方式的一个缺点是,当MATLAB执行耗时或者出错时,不易排查,因为调用者仅能获取到执行结果,无法获取到MATLAB脚本中的debug、info等信息,因此适用于算法成熟、固定的场景。在算法灵活多变或者不成熟的情况下,跟踪脚本执行无疑是重要的,此时可采用方式二,即调用MATLAB命令行执行。

调用MATLAB命令行执行,MATLAB将启动应用程序,然后执行脚本,执行过程中的输出信息可以输出到命令窗口中,类似于分析人员执行使用MATLAB分析一样,只是其分析过程实现了集成、自动化。

C#.Net与MATLAB集成的更多相关文章

  1. 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

    http://www.matlabsky.com/thread-43937-1-1.html   <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下)     ...

  2. Matlab图像处理入门

    1. Matlab基础 1.1     数据格式 Matlab默认的数据格式为双精度浮点数的矩阵或数组,同时支持其它数据类型.Matlab将单变量看作1´1的数组.Matlab支持的数据类型如下: 索 ...

  3. MATLAB学习笔记(二)——主要是MATLAB的矩阵知识

    PS:主要是讲解矩阵的相应的实现方法,其实MATLAB的很大一部分的优势,就是集成了矩阵级别的运算,并以此为特点,可以进行多维空间上的验证. 让我们懂得了原来线性代数如此有用= - =. (一)MAT ...

  4. 【数学建模】MATLAB语法

    一.向量.矩阵的表示和使用 format long  %小数很多format short %默认4位小数format rat %显示最近的分数format short e %指数格式的数 尾数多少 e ...

  5. BASK、BFSK、BPSK调制方法的Matlab程序实现

    %以下为手动编程方法,也可调用matlab集成函数dmod,具体调制方式见doc. n = [0:0.01:5.99]; x1 = ones(1,100); x2 = zeros(1,100); x3 ...

  6. Python标准库、第三方库和外部工具汇总

    导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连 ...

  7. Python 标准库、第三方库

    Python 标准库.第三方库 Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写 ...

  8. 140种Python标准库、第三方库和外部工具

    导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连 ...

  9. matlab 下的集成学习工具箱

    matlab 当前支持的弱学习器(weak learners)类型分别为: 'Discriminant' 'knn' 'tree' 可通过 templateTree 定义: 1. fitcensemb ...

随机推荐

  1. C++内联函数(03)

    在C++中我们通常定义以下函数来求两个整数的最大值: 代码如下: int max(int a, int b){ return a > b ? a : b;} 为这么一个小的操作定义一个函数的好处 ...

  2. ASP.NET没有魔法——Identity与Owin

    上篇文章介绍了如何在ASP.NET MVC项目中引入Identity组件来实现用户注册.登录及身份验证功能,并且也提到了Identity是集成到Owin中的,本章就来介绍一下什么是Owin以及如何使用 ...

  3. c# Invoke和Begininvoke区别

    一.对Invoke和Begininvoke的认识 1.Invoke():同步委托,会阻塞当前主线程的运行,等待invoke()方法返回才执行后面的代码: 2.Begininvoke():异步委托,调用 ...

  4. spark三种连接Join

    本文主要介绍spark join相关操作. 讲述spark连接相关的三个方法join,left-outer-join,right-outer-join,在这之前,我们用hiveSQL先跑出了结果以方便 ...

  5. escape、unescape、encodeURIComponent、decodeURLComponent

    项目中遇到的问题,当我设置一个标签的属性,这个属性值含有js内容,这样就会被执行产生安全问题 解决办法:,可以将后端给的内容先encodeURIComponent,获取的时候再decodeURICom ...

  6. js 添加事件 attachEvent 和 addEventListener 的区别

    1.addEventListener 适用w3c标准方法addEventListener绑定事件,如下,事件的执行顺序和绑定顺序一致,执行顺序为method1->method2->meth ...

  7. Problem E: 可变长数组

    Problem E: 可变长数组 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 472  Solved: 368[Submit][Status][Web ...

  8. 万能日志数据收集器 Fluentd - 每天5分钟玩转 Docker 容器技术(91)

    前面的 ELK 中我们是用 Filebeat 收集 Docker 容器的日志,利用的是 Docker 默认的 logging driver json-file,本节我们将使用 fluentd 来收集容 ...

  9. vue-cli 脚手架目录结构说明

    目录结构截图如下 /build 编译配置文件目录,由脚手架自动生成 /config webpack 配置文件目录,由脚手架自动生成 /node_modules node依赖目录,可通过package. ...

  10. selenim之ActionChains(一)

    大家好,来介绍下,今天要分享的是小编学ActionChains的经验. 先来说一下今天要用到的方法: click(element=null)                               ...