最近做了个项目要用到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. 【LeetCode】15. 3Sum 三个数和为0

    题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find al ...

  2. Django中级篇(下)

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. MIDDLEWA ...

  3. iOS检测网络连接状态

    官方Demo下载地址:https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip 将Reachab ...

  4. django apache error.log过大

    利用apache运行django框架,发现apache中error.log增长迅猛,寻找原因不得,于是手动清空... 但是当server遇到问题时,文件过大,导致定位问题十分不便 于是决定探个究竟 首 ...

  5. 解决Linq第一次调用存储过程时速度慢的问题

    最近做项目,发现linq调用存储过程,第一次时会速度慢,但之后速度都很快,过一阵子又会慢一下,以实际的操作为例子: using (FruitDbDataContext dbo = new FruitD ...

  6. 获取AX的窗口所有控件的lableID及内容

    思路,穷举Forms\TargetFormName 在AOT上面的路径得到TreeNode, 遍历各控件的属性. a1,先读Label属性,没有就读Caption属性及Text属性. a2,若a1取不 ...

  7. 使用cnpm搭建企业内部私有NPM仓库

    cnpm是企业内部搭建npm镜像和私有npm仓库的开源方案.它同时解决了现有npm架构的一些问题. 为什么企业需要私有NPM 主要有如下理由: 确保npm服务快速.稳定:对于企业来说,上线生产系统的时 ...

  8. Groovy安装与入门实例

    摘自: http://blog.csdn.net/dc_726/article/details/8576205 1 Groovy是什么? 来看下官网的介绍:http://groovy.codehaus ...

  9. leetcode 58

    58. Length of Last Word Given a string s consists of upper/lower-case alphabets and empty space char ...

  10. js控制div颜色

    <html><head></head><style>#div1{width:400px;height:400px;background-color:re ...