最近做了个项目要用到matlab做些算法处理,然后用.net项目调用这个类,我把这个matlab封装dll总结了下如下:

matlab是商业数学软件,优势是在算法开发上面有很强的功能,提供了很多数学算法巩使用者调用比一般编程语言更容易处理复杂算法问题,而且处理算法有并行处理能力,速度上比一边编程语言也快很多.

   基于组件对象模型(Component Object Model,COM)的Matlab与其他语言混合编程方法。它以Matlab中的Matlab COM Builder模块为转换工具,将Matlab的M函数文件转换为COM组件后应用在VB程序中。

1.VB与其他语言混合编程的几种方法

         (1)  在Mathworks公司推出Matlab 6.5之前,Matlab与VB的混合编程主要有以下5种“1:(1)  中间文件传递法。用VB编写前端用户交互界面,收集必要的参数信息,并保存在一个中间文件(如temp.tx0中,然后利用异步程序调用方式执行Matlab程序;

(2)  ActiveX自动化服务技术。将Matlab作为服务器,接收通过引擎传来的数据和指令信息并进行相应的处理,然后将结果经过引擎返回给发送请求的客户机;

(3)  动态数据交换(DDE)。它是进程之间的通信机制,使用Windows消息和共享的内存,使相互作用的应用程序能够动态地交换数据;

(4)  动态连接库(DLL)。应用MathTools公司的Mideva工具软件,借用C++编译器将MATLAB的M函数文件转换为DLL,在VB中加载该DLL;

(5)   MatrixVB。它是Mathworks公司相应于Matlab而开发的COM库,在安装MatrixVB后,开发VB程序时可以直接调用600多条Matlab中的基本函数,从而完成Matlab的矩阵运算和图形显示功能。

在上述5种方法中,前3种方法调用过程较复杂,且无法脱离Matlab环境,这直接影响了所开发软件的独立运行和发布。后两种方法虽然能够脱离Matlab环境,但Mideva和MatrixVB软件已停止发行。
         为解决与其它应用程序之间的接口问题,Mathworks公司在其2002年推出的Matlab6.5中新增了MatlabCOMBuilder模块,它提供了一个简单易用的图形化用户界面,帮助用户将Matlab的M函数文件自动、快速地转变为独立的进程内COM组件,它以.DLL(ActiveX DLL)形式被装入到客户的进程空间中,可以在任何支持COM组件的应用中使用,例如Visual Ba sic、c#,Microsoft Excel、C/C++语言等。其优点在于VB访问该COM组件时,没有必要进行环境切换,因此可获得最快的运行速度。 

2.开发环境配置(Matlab7.11+vs2010+windows7)

(1)  在Matlab中创建COM组件Matlab COM Builder是Matlab Compiler的扩展,安装Mat1ab7.11时至少需要选择Matlab、MatlabCompiler和MatlabCOMBuilder等选项。

(2)  在使用COMBuilder创建COM组件之前还需要对Matlab Compiler进行必要的配置。方法如下:在Matlab命令窗中键入mbuild  -setup,将出现选择编译器的提问,所列出的编译器包括计算机中已安装的各种C/C++编译器,例如Matlab自带的C/C++编译器、BorlandC++Builder4、BoflandC++Builder5、Borland C++Builder 6、Microsoft Visual Studio 5.0、MicrosoftVisualStudi06.0、MicrosoftVisualStudio.NET等,用户可根据需要自行选择其中一种并确认即可。如下图运行界面:

(3)   使用matlab7.11自带工具,命令窗口键入deploytool,回车后出现对话框,选择路径,新建一个COM工程,target选择为”Generic COM component”

3. COM组件的创建

安装和配置完成之后,就可在刚生成的工程中创建COM组件

具体过程如下:

<1>  编写M函数文件。在M函数文件中,给出要求Matlab完成的功能,函数文件能够接收参数,也允许返回参数。另外需注意:M函数文件的文件名必须和函数名一致;且COM Builder并不是支持所有的Matlab函数,如某些工具箱函数,具体限制可参阅 Matlab Compiler users Guide;

<2>  单击“add Class”创建类

<3>  单击“AddFile”按钮,添加已经在Matlab环境下编译通过的M函数文件;

<4>  单击“Build”按钮。待编译完成、生成DLL文件,至此,用户编写的M函数文件已转换为COM组件对象。

<5>  将创建成功的COM组件注册到使用它的目标计算机上,且目标计算机要安装MCR。方法如下: 点击package,点击“ADD MCR”把运行环境打包

4.目标计算机以管理员身份安装上面生成的安装包,默认路径安装。安装过程会自动在目标计算机安装matlab运行环境和注册之前生成的DLL。

5.然后VB工程中就可以添加引用,找到和使用之前生成的COM组件。

6.编写程序代码,调用Matlab中的类和函数

PS:遇到的问题:

       1.调用类的时候可以编译但运行的时候出现这个错误“检索 COM 类工厂中 CLSID 为 {8E813545-D35B-4F2B-A27A-C0FFA0430223} 的组件失败,原因是出现以下错误: 80040111 ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))。”,解决办法将matlab 的bin目录拷贝到path环境变量里,然后重启下机器就OK了.

       2.出现“未能确定Com引用的依赖项,加载类型库出错”的异常,原因为matlab库中“C:\Program Files\MATLAB\MATLAB Compiler Runtime\v714\runtime\win32\MWComUtil”需要注册.

3.用VS调用函数的时候,如果matlab里面函数需要一个参数,调用的时候就要写三个参数,第一个是空值,第二个是返回值,第三个传进去的值.

matlab封装DLL混合编程总结的更多相关文章

  1. Matlab与.NET混合编程解决人脸识别问题

    原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...

  2. matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)

    matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...

  3. [转] Matlab与C++混合编程,添加OpenCV库

    原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...

  4. Matlab与C++混合编程,添加OpenCV库

    最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...

  5. Matlab与C++混合编程 1--在C++中调用自己写的matlab函数

    在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...

  6. 【目录】Matlab和C#混合编程文章目录

    本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...

  7. 算法库:Matlab与C++混合编程

    算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...

  8. Matlab与C++混合编程(依赖OpenCV)

    Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...

  9. matlab与vs混合编程/matlab移植

    前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

随机推荐

  1. IBM Appscan基本操作手册

    一.操作前提 1.首先下载Appscan的安装包 2.安装Appscan 二.操作流程 1.双击图标,打开Appscan软件 2.打开软件后,页面显示如下: 3.选择“文件-新建”,弹出如下的窗口: ...

  2. 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(三)

    看了上一章的内容,想必较为简单的case也都会编写了吧,但是是不是觉得,如果能够实现用例参数化,是不是会节省很多劳动力,这节就来学下RF中的user keywords,会让你发现写用例原来可以这么简单 ...

  3. js的replace方法

    今天在项目中发现,js的replace方法,其实只是替换第一个匹配的字符: 比如 backstreetboy.replace('b','B') 得到的结果是Backstreetboy,只是替换了第一个 ...

  4. .net Url重写

    详细说明及下载dll源码路径: http://msdn.microsoft.com/zh-cn/library/ms972974.aspx 顺带上本人写的一个小例子:http://files.cnbl ...

  5. pig命令行快捷键

    删除 ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dl ctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dh ctrl + k 删除光标后面所有字符相当于VIM里d ...

  6. 一款安卓ShowcaseView视图源码效果

    该源码是从源码天堂那边转载过来的,大家可以看看一下吧啊,一款安卓ShowcaseView视图源码效果,非常不错的,特别是在做引导时使用. 源码下载地址:http://code.662p.com/vie ...

  7. 前端开发之-------------合理利用CSS的权重----------------

    什么是CSS的权重?对于前端工程师来说,这是一个很基础的问题,如果前端工程师没有深刻理解这个概念,则很难写出高质量的CSS代码. 那么到底什么是CSS的权重呢?我们又怎么来进行判定CSS的权重呢? 讨 ...

  8. PF_RING安装

    1.安装Build-essential.SVN.Flex.Libnuma-dev.bison ubuntu中:sudo apt-get install build-essential subversi ...

  9. Aspose.cell.dll的使用,导excel表

    using System; using System.Web; using EF; using Newtonsoft.Json; using System.Collections.Generic; u ...

  10. C#获取程序所在目录路径

    方法1:Directory.GetCurrentDirectory().这个方法只能在.NET的完整版中使用,NETCF中不支持该功能,调用时会引发异常.获取的是当前目录,并不一定是真正的路径,跟Op ...