在数学分析工具方面,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. 跨域资源共享CORS实现

    问题描述: 本地已经实现的restful接口,在地址栏输入url:loaclhost:8080/admins即可得到预期的json字符串,在网页上显示如下: [{"id":1,&q ...

  2. Java并发编程之显式锁机制

    我们之前介绍过synchronized关键字实现程序的原子性操作,它的内部也是一种加锁和解锁机制,是一种声明式的编程方式,我们只需要对方法或者代码块进行声明,Java内部帮我们在调用方法之前和结束时加 ...

  3. php mysqli MySQL server has gone away 问题分析

    结论 mysqli没有处理对端(MySQL server)的断开请求.在send时,收到对端(MySQL server)的RST,会打印MySQL server has gone away. 环境 x ...

  4. Visual Studio 调试技巧[Command Window & Immediate Window ](Tips)

    Visual Studio 调试技巧[Command Window & Immediate Window ](Tips) 1. immediate window 定义的一些 alias (// ...

  5. 关于NIM博弈结论的证明

    关于NIM博弈结论的证明 NIM博弈:有k(k>=1)堆数量不一定的物品(石子或豆粒…)两人轮流取,每次只能从一堆中取若干数量(小于等于这堆物品的数量)的物品,判定胜负的条件就是,最后一次取得人 ...

  6. (二): 基于ZeroMQ的实时通讯平台

    基于ZeroMQ的实时通讯平台 上篇:C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework)----(一):整体介绍 通讯平台作为 ...

  7. windows系统扩展C盘的工具推荐(解决了C盘和压缩卷不相邻无法扩展C盘问题)

    1.下载分区工具 “分区助手3.0中文版” 下载地址:http://www.33lc.com/soft/14880.html 2.下载下来是一个压缩包,解压后运行安装程序. 3.安装完成后按以下步骤执 ...

  8. 闲聊select和input常用的小插件

    前言 在pc端的项目中,经常会用到表单标签,莫过于是select和input这两种,这两种相当常用.但往往原生的功能不尽人意,即使 input中type有n多属性,甚至连时间控件都有,但仍旧满足不了我 ...

  9. Docker安装和卸载

    一:卸载旧版本 老版本的Docker被称为docker或docker-engine.如果安装了这些,请卸载它们以及相关的依赖项. $ sudo yum remove docker \ docker-c ...

  10. Winform C# 简单实现子窗口显示进度条

    主窗口代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...