博文

Matlab Add-in 与VC++ 的混合编程技术(2007-8-8 13:50:00)

1 引言
        Matlab 是使用广泛的数学软件是一个完整的数学平台Matlab 在图象处理方面有着明显的优势 具有强大的矩阵运算功能在进行一些图象变换时避免繁琐的计算 有专用图形显示函数消除了显示界面设计的瓶颈 有丰富强大工具箱函数支持对图象的分析和理解透彻但Matlab 强大的功能不能脱离它的环境在Matlab中使用行解释方式执行代码限制了代码执行速度开发一个Matlab 与其他高级语言的接口就
可以把Matlab 的强大功能融入各种应用程序中通过高级语言编译器编译为二进制代码从而大大提高执行速度
        Visual C++可以开发从底层系统级到高层用户级的各种软件但VC++在图象处理等工程计算方面和图形显示方面与Matlab 相比显得复杂而麻烦将Matlab 与Visual C++结合编程将改善工程应用如图象处理应用程序的编写及开发其混合编程方式分为5 种
        Matlab 引擎方式采用客户机/ 服务器的计算方式Matlab 作为ActiveX 自动化服务器VC++的程序作为前端客户机利用Mideva Mideva 是Mathtools 公司推出的一种Matlab 集成编译开发平台可将M 文件转换为C/C++源码然后添加进MSVC 工程中
        VC++ 程序中按照Matcom 语法直接书写Malab C/C++数学函数语句用Matlab 的Mcc 将M 文件翻译成CPP 代码然后在C/C++编译器中调用也可用Mcc 将M 文件编译为独立可执行程序Stand-alone Matlab Add-in 添加式编程方法各有利弊方法要求
        后台运行Matlab 程序运行速度慢方法对于部分语句以及Struct 的支持有缺陷方法类似于SDK 开发局限性比较大不符合现代软件设计的规范方法纯手工操作本身也不支持部分图形语句对类的支持不够方法最简便易学但要求Matlab V6.0 以上版本同时要求有集成编译环境如Microsoft Visual C/C++ V6.0 或Borland C++ Builder 6.0 等
2 Matlab Add- in
        Matlab 6.0 以后版本对其Compiler 作了改进它支持更多的数据类型具有更强的优化功能更为重要的是其Matlab Add-in 提供了一个Matlab 和VC++直接集成的途径它具有一些新的特征快速集成M 文件到C++工程中创建独立的C/C++应用程序或C MEX DLL 通过M 文件创建共享库或MEX 文件内含Visual Matrix Viewer 调试过
        程中可以查看矩阵变量的值直接修改M 源文件而不是修改生成的C/C++ 文件方便快捷地打包应用程序等这种方式即避免了生成导入库Lib 文件的麻烦又不需要Mediva 的介入同时生成Stand-alone 独立可执行程序可脱离Matlab 单独运行下面以Matlab 6.0 Microsoft Visual C/C++V6.0 MSVC 为主介绍其安装使用方法
2.1 Matlab Add-in 的安装
(1) 启动Matlab 在命令窗口内输入Mex-Setup” Visual C/C++ V6.0
(2) Matlab 环境下运行“mbuild-setup” 按提示选取Microsoft Visual C/C++ version 6.0 它将配置使用MSVC 为默认的编译器这是创建独立应用程序Stand-alone 必需的并安装Matlab Add-in所需的Matlab Compiler 和C/C++ 数学库文件到MSVC 目录
(3) 仍在Matlab 环境下运行cd(prefdir) 和mccsavepath prefdir 是matlab 内部工作环境变量mccsavepath 命令将保存当前Matlab 路径到mccpath 文件中
(4) 在Microsoft Visual C/C++ 环境中配置
Matlab Add-in MSVC 工具栏上将出现M 文件加入Matrix Viewer Add-in Package Help 等MatlabAdd-in 图标以后每次启动VC++ 自动加载MatlabAdd-in
(5) 配置Windows 系统
        使用这种方式需要注意以下几个问题添加入MSVC 工程中的M 文件必须为函
数文件而不能是脚本文件否则程序会出错最好不要修改生成的C/C++代码如果需
要改动可以通过在MSVC 工作区FileView 选项卡下直接修改M 原文件可以通过在M 文件中设置断点在运行中通过Matrix Viewer 观察Matlab 变量的值
3 Stand -alone 程序实例
        把Matlab Add-in 与VC++混合编程的方式应用于图象处理图象分割的算法在Matlab 下已写好命名为banji.m 的M 函数文件记住存放路径启动MSVC 打开File New 菜单选择Project 选择Matlab Project Wizard , Project Name命名为Banji 点击Ok 屏幕显示另一界面可选择所生成应用程序的类型Windows Console EXE C-MEX DLL M-MEX DLL Shared M-DLL 还可选择代码为C 程序还是C++ 程序选择Debug
还是Release 模式选择是否生成Main 函数是否需要支持图形等这里选择生成C++程序其余采取默认设置点击Finish 再Ok 以后出现一个对话框要求选择添加到工程中的M 原文件按路径选择文件banji.m 后可看到MSVC 调用Mcc 编译生成一个混合M 文件和C 的工程在File View 选项卡中可看到添加的M 文件和自动生成的C++文件再编译后就可生成Stand-alone程序Banji.exe 了要运行Stand-alone 程序可直接在MSVC 集成环境中完成但要注意若编写的M 函数文件需要参数时就只能转到命令行下用Stand-alone 程序名后跟参数的方式执行具体说来就是转到Microsoft Windows Dos 下然后用Banji.exe**执行其中** 指的是所要用的参数文件名执行前还需确保参数文件已存在于同一路径下
4 结束语
        Matlab Add-in 提供了一种直接集成M 文件到MSVC 下混合编程的方法通过它可以很方便地生成Matlab 和VC++的混合程序这在图象处理信号处理等需要大量计算可视化界面的工程应用领域有广泛的应用价值但是这种方式也是通过Mcc 预先将M 文件编译为C/C++程序的所以Mcc方式有的缺点如不支持所有Matlab 函数语句基本上它都有这只有期待Matlab V
6.0 以后的版本予以改进了。


阅读全文(1979) | 评论:0 | 复制链接

基于VC++与Matlab混合编程的图像处理(2007-8-5 10:51:00)


摘要
本文主要讨论了VC++Matlab混合编程的两种常规方式,给出了利用Matlab数学函数库混合编程的实现方法,指出了常规方式存在不足的同时,提出了另外两种方法,实现了利用Matlab数学函数库和编译器结合VC++混合编程的新方法,充分发挥了VC++有效运算速率与Matlab强大矩阵运算的优点。实验结果说明本文所提方案可行,适用于图像处理。

关键词Matlab VC++ 混合编程; 数学函数库; 编译器


1.      引言

MatlabMathworks公司推出的一套工程计算及数值分析软件。由于功能强大、易使用,得到了广泛应用,特别是在图像信号处理,语音信号处理,信号分析等领域充分展示了其强大的矩阵运算功能。虽然Matlab是一个完全独立的编程和数据运算的集成环境,但是对于循环处理、图形界面、算法隐藏及系统集成等方面有所欠缺。VC++是一种面向对象的可视化编程语言,代码效率高,便于用户进行交互处理,但利用其基本数学函数库开发子程序与数值算法时,往往比较繁琐,且需反复调试以确保其准确性。VC++Matlab混合编程,可有效地发挥各自优势,为科学研究和工程开发提供强大的技术支持。本文所有讨论均基于Windows操作平台下的MSVC++6.0编译环境和Matlab6.5环境。

2.      两种常规混合编程方式

传统的VC++调用Matlab的方法有:利用Matlab引擎、利用Matlab编译器、利用Matcom软件编译、调用Matlab数学函数库、及调用Matcom数学函数库。这其中利用Matlab引擎不能脱离Matlab环境,且运行程序较慢;关于Matlab编译器下文将进行详细分析;Matcom软件对Matlab语句支持不够,且其开发公司已被Mathworks收购,自发布4.5版本以后已停止开发;MatlabMatcom所封装的数学函数库提供了大量的实用函数,可以完全脱离Matlab环境使用,是较为常用的混合编程方式。目前Matlab数学函数库基本上已包含了Matcom数学函数库,这里仅介绍一下利用Matlab数学函数库的混合编程方案,Matcom数学函数库使用类似,有关利用Matcom数学函数库的混合编程详细说明可参阅文献[1]

Mathtools公司自MATLAB5.3便提供了数学函数库,主要使用C/C++语言开发,使用它可以用类似MATLAB的语法编写C++程序,十分方便。虽然速度上仍然比手工C/C++程序慢,但是由此换来的高效的开发效率和可靠性往往是值得的。该数学函数库包括了一个统一的编程接口和大量丰富的矩阵计算和函数。这些函数经专家采用优化的算法完成,并对矩阵的执行效率进行了优化。该数学函数库简化了在C++语言中对矩阵的处理,其核心类是mwArray类。用户可以在VC++集成编译环境下采用类似开发m文件程序的编程方式,语法直接简单。其具体实现步骤可参见文献[3]

需要说明的是C++语言中数据存储是按行优先的方式,而Matlab矩阵数据存储时是按列优先的方式。以二维矩阵为例,说明两种不同环境下存储格式的不同。假定声明了一个整形二维数组a[2][3]={1,2,3,4,5,6};C++语言中,数组a在内存中的存储顺序为:123456,即按行优先的原则进行存储。在Matlab环境中,数组a在内存中的存储顺序为:142536,即按列优先的原则进行存储。

利用以上两种数学函数库的混合编程,都能带来算法上的极大简化,但也有几点不足:

1)        两种数学函数库下矩阵操作均需通过各自的函数进行,对于经常使用Matlab开发算法的程序员来说,使用时会带来一定程度的麻烦,且VC++环境下矩阵操作相对Matlab环境不够灵活。

2)        而最大的问题在于,两种数学函数库所封装的函数远远少于Matlab环境下的函数库,不能充分发挥Matlab强大的矩阵计算功能,尤其是其中的工具箱函数,而工具箱函数却是我们实际应用中经常需要用到的。因此如何更好的利用Matlab环境下优秀的矩阵运算及强大的工具箱函数,是本文讨论的另一个重点。

3.      两种混合编程新途径

1)        利用matlab环境下的Mat文件进行不同编程环境下的数据交互。

Mat文件是Matlab系统保存文件的默认文件格式,文件存储为二进制格式,可以利用其在不同平台或不同应用程序间传递数据。Matlab环境下mat.h文件包含了mat文件的创建、读写等函数的定义。利用mat文件可以提供复杂的准备数据、处理VC++环境下的中间数据、及进行后期处理数据的准备,如本次实验中利用了Matlab工具箱中的滤波器工具箱创建了一个大小为 的复杂滤波器,而通过在VC++环境下读取此mat文件获取滤波器,简化了算法的实现。

此种方法的缺点是不便于用户的交互,只在某些特殊场合下需要,如提供复杂的初期准备数据时,这里我们主要讨论下面这种混合编程的方法。

2)        利用Matlab编译器将M文件自动转换成CC++文件。

  Matlab编译器是MathWorks公司为Matlab开发环境提供的一个软件工具,利用它可将Matlab环境下的M文件转换成CC++源代码,这些源代码可以再被编译链接生成VC++环境下可执行程序或动态链接库。这种方式主要有以下三个优点:

1)        使程序的执行效率大大高于在Matlab环境下M文件的执行效率,尤其是在M文件中包含了大量的循环语句时。

2)        隐藏了算法的私人拥有权,因为MatlabM文件是ASCII文件,任何人都可以打开显示或者是编辑,将M文件编译链接成Mex文件或独立的应用程序时就转化为二进制文件,从而可以隐藏算法的源代码,并能阻止对文件的恶意修改。

3)        生成独立的应用程序或C共享库和C++静态库,从而集成到C/C++应用程序中,便于系统的集成开发。

而这种做法最大的优点便是可以将部分工具箱中的函数转换为C/C++源码,极大扩展了Matlab C/C++函数库的使用环境,充分发挥Matlab强大的工具箱函数作用。Matlab工具箱中函数其实是M文件,理论上来说,M文件在满足一定编译条件下就能通过编译器转化为C/C++源码。以本次实验中将其Images工具箱中的imnoise函数,转化为可用的C++源码为例来说明其具体做法,其实现步骤见下图:其中MCC编译命令为:mcc –h – t –L Cpp myimnois(各参数含义可参阅文献[3][4]),大量*.hpp*.cpp文件中产生的主要源文件是myimnoise.cppmyimnoise.hpp,其他文件是函数实现时需要调用到的相关函数,在VC++工程中添加这些文件,编译通过即可运行,这样便实现了工具箱函数在VC++环境下的调用,扩展了工具箱函数的使用环境。

需要说明的是,理论上来说在利用mcc编译工具箱函数时,只要包含所有相关的源文件,便可实现工具箱函数的转化使用,但实验证明,因为其工具箱函数是大量相关M文件的互相调用,所以在转化为C/C++源码时,会产生大量的相关文件,以本次实验中另一个工具箱函数edge.m(此函数在Matlab环境下支持多种类型边缘检测)为例,转化后产生四百多个共十几兆的相关文件,给使用和调试带来不便。

相关Matlab 编译器命令mcc常用选项含义如下:

mcc -p 创建C++独立应用程序;

mcc -e 创建C独立应用程序;

mcc -B sgl 创建C独立应用程序(与图形库连接);

mcc -B sglcpp 创建C++独立应用程序(与图形库连接);

mcc -c 产生c/c++码文件,而不生成exe文件(或mex文件);

mcc -h 把被调的助理函数与主函数联同编译;

mcc -w 编译过程中给出提示信息。

4.      一个应用混合编程处理天文图像的例子

在利用总变分TV: Total Variation极小正则化方法对天文图像进行高清晰恢复时,对总变分进行极小化过程中出现的欧拉-拉格朗日问题,可以写作是一个非线性各向异性扩散方程,加上一个表示未知图像与点扩散函数进行卷积的强制项,于是正则化问题就变成对(1)式最小化的问题[5][6]

   (1)

其中 Hilbert空间上的有界线性算子,表示降质算子, 是一个非零参数, 为退化图像, 代表着对复原图像 的某种线性运算,对上式求一阶导数有:

2  的伴随矩阵,上面的非线性方程就是求解 需要解决的问题,而解(2)式存在很多计算上的困难,分析如下:

1)        由于影像象素的数量多,即使是对一般分辨率的影像而言,问题的尺寸也会非常的大。

2)        处,TV函数不可微,在真实影像中,这种情况是很常见的。因此常需要构造一个足够小的正参数 ,来进行调节,即用 来替换 ,参数 应该足够小,但也是不确定的。

3)        虽然TV有稳定性,对于线性化后的线性系统,如果 ,该系统具有很差的条件数,使得共轭梯度等迭代方法收敛的非常慢。

由上分析可知总变分方法在数值求解上是比较困难的:如在VC++环境下实现,需要进行大量的内存操作,傅利叶变换,及二维卷积等实现。而采用VC++MATLAB混合编程时,一是可以利用其运算精度高,特别是其运算结果的可视化功能便与算法调试。二是由于该语言的基本编程单元是矩阵,而图像的数据结构亦是矩阵(二维数组),而且VC++是对图像是逐像素操作,对于一幅普通分辨率的图像来说,处理起来运算量也非常地大,因此采用矩阵处理图像是非常合适的。三是可以充分利用其图像处理工具箱软件提供了大量对图像进行常规操作的命令如快速傅利叶变换、卷积计算等,这些命令都是由图像处理方面的专家撰写的,具有高度的稳定性和可靠性。

 

2为本次实验结果,从处理的最终结果来看,基本上实现了模糊图像的超分辨率重建,达到了图像增强的目的;从时间代价上来看,如在Matlab环境下处理这样一幅 像素大小的图像则大约需时30分钟左右,而按本文方法将源码M文件编译转换成CC++文件后,在VC++下运行所需时间将会缩减到2分钟 ,实验证明本文方法在对类似图像处理方面有一定的应用价值。

4、      结论

由上述论述可知,在进行MatlabVC++混合编程进行图像处理时,一方面可充分利用两种数学函数库的强大功能,直接在VC++环境下按照数学函数库的语法进行编程,另一方面也可利用Matlab对矩阵操作的便捷性,及其强大的工具箱函数,可在Matlab环境下开发核心算法,编写M函数文件,然后利用Matlab编译器将M文件解释为C++源码,在VC++工程中直接调用。考虑到Matcom数学函数库将不会再更新,推荐用户使用Matlab的数学函数库,在使用时,尽量选择第一种方法,即直接在VC++环境下编程,若牵涉到大量的矩阵元素操作或工具箱中函数,则可以考虑第二种方法。

参考文献:

[1] MathTools Ltd.MIDEVA MATCOM & Visual MATCOM user’s guide V4.5 realease [Z].1999

[2] MATLAB C++ Math Library user’s guide V2.0.1999

[3] 陈永春.Matlab/Sinmulink 模型到代码实现[Z].北京:清华大学出处社,2002

[4] 何强,何英.Matlab扩展编程[M].北京:清华大学出处社,2002

[5] 邹谋炎,刘小军.总变分图像复原方程的离散化方法[J].电子与信息学报,2001.9:861-867.

[6] 张亶,陈刚.基于偏微分方程的图像处理[M].北京:高等教育出版社,2004.

[7] 郑树灵,王树根.整体变分算法在图像修补中中的应用研究[J].计算机辅助设计与图形学学报,2003.10:1218-1223.


阅读全文(4340) | 评论:4 | 复制链接

VC++中使用MATLAB的C++数学库和MCC生成的程序 (2006-12-4 18:47:00)

VC++中使用MATLAB的C++数学库和MCC生成的程序

---- 转载于obase.163.net

 

0、简介

MATLAB5.3的提供了C/C++数学库,其中的C++数学库功能很强,使用它可以用类似MATLAB的语法编写C++程序,十分方便。虽然速度上仍然比手工C/C++程序慢,但是由此换来的高效的开发效率和可靠性往往是值得的。另外mcc命令可以将M文件转化为C或CPP文件,编译后可以脱离MATLAB运行,它们也是使用的C/C++数学库。

不过,MATLAB的数学库在开发时似乎倾向于编译独立的可执行程序,把VC、BC只是作为一个编译和连接的工具,而没有过多地考虑在VC、BC的集成环境下进行开发。这给我们带来了不便。

很多网友问起如何将MCC生成的C++程序嵌入到VC。最近对这个问题做了一下尝试,在这里做一个总结,请大家回去试试。这里只介绍VC的情况,用BC的网友就自己研究研究吧,估计是类似的。

1、设置项目编译选项

首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单:

Project->Settings->C/C++

Category:Preprocessor

Preprocessor definitions:
添加: MSVC,IBMPC,MSWIND

Category: Precompiled Headers

选择: Automatic use of precompiled headers
Through header: stdafx.h


2、调设置项目连接选项

首先要从下面几个函数定义文件(*.def)生成相应的导入库文件(*.lib)

libmmfile.def
libmcc.def
libmatlb.def
libmx.def
libmat.def

它们位于目录c:\matlab\extern\include
用下面命令导出库文件:

lib /def:libmmfile.def /out:libmmfile.lib /machine:ix86
lib /def:libmcc.def /out:libmcc.lib /machine:ix86
lib /def:libmatlb.def /out:libmatlb.lib /machine:ix86
lib /def:libmx.def /out:libmx.lib /machine:ix86
lib /def:libmat.def /out:libmat.lib /machine:ix86

将它们放入你的项目连接选项

Project->Settings->Link

Category:Input

Object/library modules:
添加:libmatpm.lib libmmfile.lib libmcc.lib libmatlb.lib libmx.lib libmat.lib

注1: 中间是空格,不要加逗号
注2: libmatpm.lib是C++ MathLib的库,如果是只用C,就不用连接它了。

Ignore libraries:
添加: msvcrt.lib
注: 仅在Debug版本中需要。原因不明:P

以上的这些lib文件,我已经做好了,打了个包放在这里下载:matlablibs.zip (64K)

3、设置编译环境

Tools->Options->Directories

Include fiels添加:

c:\matlab\extern\include
c:\matlab\extern\include\cpp

Library fiels添加:

c:\matlab\extern\lib
c:\matlab\extern\include

注:下面这个目录是那些lib所在的地方。
如果都挪到上面的目录,这个自然就不要了。


4、编写程序

用MCC命令生成的CPP文件和自己手工编写的CPP文件, 其项目设置是完全相同的,
程序的语法原则上也是一样的. 只是MCC生成的CPP文件有大量"没用"的代码.

(1)添加自己编写的程序模块

用下面文件头:
#include "stdafx.h"
#include "matlab.hpp"
然后, 按照C++ MathLib文档要求的格式书写程序.

(2)嵌入mcc生成的文件

在MATLAB下用下面格式的命令生成cpp文件

mcc -t -L Cpp test

得到test.hpp, test.cpp
将test.cpp加入项目, 不做任何改动.

最后,摁F7编译就可以了。

5、实例

上面罗罗嗦嗦一大堆,肯定让你打哈欠了:P

没关系,其实还是挺简单的,这里有个VC的project,用C++数学库解决了一个幼儿园的算术题,下载回去看看吧,马上就明白了。

MccDemo.zip (68K)

这里先说明一下:

MATLAB程序test.m:

function [sum, prod]=test(x,y)

sum = x+y;
prod = x*y;

用来计算两个数的和与积。注意这是两个返回变量的情况。
另外,x,y当然可以是数组。

用mcc命令生成了test.hpp和test.cpp。

文件demo.cpp:

#include "stdafx.h"
#include "matlab.hpp"
#include "test.hpp"

void mccDemo()
{    CString str;
    mwArray x, y, sum, prod;
    double dx,dy,dsum,dprod;

    x = 5.0;
    y = 10.0;
    sum = test(&prod, x, y);

    dx=x(1,1);
    dy=y(1,1);
    dsum=sum(1,1);
    dprod=prod(1,1);
    str.Format("%f+%f=%f\n%f*%f=%f", dx,dy,dsum,dx,dy,dprod);
   
    AfxMessageBox(str);
}


由于采用了C++数学库,语法很简单。注意数组的赋值、其中数据的存取,这些都要仔细地看手册。

最后是跳出一个消息框,显示计算结果。

改程序启动之后,选择菜单mcc->demo即可。


阅读全文(2370) | 评论:1 | 复制链接

VC与Matlab的混合编程!(2006-12-4 18:46:00)

VC与Matlab的混合编程
VC与MATLAB混合编程大致可以分为两类:一类需要MATLAB后台支持的混合编程,一类是不需要MATLAB支持而生成独立运行程序的混合编程。
1.        需要MATLAB后台支持的混合编程
又分为两类:
1.1将原有的C程序写成子函数的形式
        在子函数中加入固定格式的void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray * prhs[])函数,然后调用MATLAB的mex指令,在mex后输入要编译的c程序名,即可生成在MATLAB环境下直接运行的DLL文件。MATLAB的PDF文档中有详细介绍。
1.2通过外部调用的方式实现
        首先将M文件的文件名加入到一段c程序中,通过MATLAB中的mex批处理文件将该c文件生成exe文件,然后通过VC的外部调用的函数shellexec()或winexec()实现调用。Mex 批处理的调用格式如下:
Mex –f msvc60engmatopts.bat *.c
上面的方法可能在编译时出错,具体与MATLAB与VC的环境设置有关,可以自己查一查。^_^
2.        利用MIDEVA生成不需要MATLAB后台支持的程序
上面实现了MATLAB与VC的混合编程,但仍需要MATLAB运行环境的支持。当然我们更希望实现能够脱离MATLAB运行环境、能够独立运行的程序,下面讲讲。
MIDEVA是MATHTOOLS公式推出的MATLAB替代产品,是该公司原MATCOM的扩张。在很多方面MIDEVA比MATLAB强大,它最主要的特点是能够将M文件转化为c语言的代码,并可通过VC或BC编译成可执行代码或dll。当然,之所以推出这个工具也是考虑到M程序执行速度慢的原因,毕竟m程序是解释执行的(为什么?自己查一查吧!^_^)
下面是MIDEVA的几种用法:
2.1利用MATCOM生成独立执行的exe文件
MATLAB环境中有M文件生成的可执行程序不能脱离MATLAB 环境的,而利用matcom可生成脱离MATLAB环境而独立运行的程序,其生成方法相当的简单,如果你用的是低版本的MATCOM,也就是命令行形式的那种,文件不大,可能就几兆,(如果谁需要我可以给大家或是自己到INTERNET 上down),那么使用方法你自己可以看看他的帮助(本人没用过)。如果用的是Visual 版的,那么就简单多了:菜单File/compile to exe/即可,编译完成后可在debug目录中找到一个与M 文件同名的exe文件。
2.2利用MATCOM 生成dll
这一功能只针对VC而开发,DLL的生成方法与exe文件的生成方法相同,可以生成针对VB,EXCEL/DELPHI等的动态库文件,使用非常方便。生成dll的过程同样要生成cpp文件,mathtool公司建议用户:如果使用VC开发,最好直接使用MATCOM编译生成cpp文件,而不是直接使用dll文件(原因自己查查吧)。
2.3实现VC环境中直接对m文件进行编译。
进入VC,单击tools菜单-》customize->Add-ins and macro files->browse,选择文件类型为dll,在MATCOM的bin目录中找到MVCIDE.DLL,OK.这样在VC工具兰出现了心的工具,可以直接在VC中编译m文件了。
2.4利用matrixlib在MFC中编程。
与上面的介绍的方法差不多,不过加入的不是MVCIDE.DLL文件,而是v4500v.lib.直接在VC中编程实现自己需要的功能就可以了,不过需要注意的是:程序必须遵循MATCOM 的语法。
说了这么多,不知大家明白没有。(希望大家都明白了,免得我打半天的字白废了力气)


阅读全文(2611) | 评论:0 | 复制链接

MATLAB外部程序接口实现方法研究(2006-12-4 18:41:00)

MATLAB外部程序接口实现方法研究

  要:介绍了四种Mat lab外部程序接口方法及其特点,详细说明利用mat labcom builder开发com组件的方法,以及在vb.net vcDelphi环境下的调用com组件的方法。

关键词:MATLAB COM BuilderCOM组件


引言

Mat lab是一种以矩阵和阵列为基本编程单元的科学工程计算语言,它提供了功能齐全的数学函数和各种工具箱,在矩阵运算、数值计算、数值信号处理、系统识别、神经网络、图像语音处理等许多方面得到了广泛的应用。Matlab的计算功能非常强大,即使是复杂的计算程序,开发效率也很高,其主要缺点是执行速度比较慢。在解决实际问题时,往往利用matlab实现矩阵运算等计算过程,其他语言工具再通过与matlab的接口调用计算过程,返回结果。这样,就可以将其他语言灵活高效的编程能力和matlab强大的计算能力有机结合起来。

1  Matlab接口的实现方法介绍

其他语言与Matlab接口的实现有多种方法,下面介绍四种常见的方法。

1.1利用文件传递数据

   利用文件传递数据是一种简单、方便的方法。实际使用中,可以使用文本文件、dat文件等文件来传递数据。如果用二进制数据文件传递数据,要注意Matlab与其他语言中二进制数据所占用的字节数以及输入输出所对应得格式要相匹配。

   这种方法可以把M文件编译成可独立执行的EXE文件,这个EXE文件通过读入其他语言中用于传递数据的文件的数据,经过计算后,将结果放到文件中,然后其他语言读出文件中的数据。这样,就可以避免在其他语言中进行复杂的数值计算。

1,2利用ActiveX技术

   ActiveX是由Microsoft制定的一种独立于编程语言的组件集成协议,它不受开发环境的限制。ActiveX空间能够在不同的环境中使用,包括VCDelphic++ builder等。可以利用自动化服务器和自动化控制器技术,实现matlab和其他语言的接口。

1.3利用Mideva平台

MidevaMathtools公司推出的一种matlab编译开发软件平台,是一个强大而完备的M文件解释和开发环境,它通过应用Matcom和实时编译技术而达到快捷的速度。该软件平台有为Borland c++Visual basicDelphi等编程语言开发的不同版本。Mediva具有编译转换功能,能够将matlab函数或编写的matlab程序转换为c++形式的DLL,然后在Delphi中调用动态库函数,这样就可能实现对matlab各种工具箱的调用。同时,Mediva提供了上千个基本功能函数,包括基本操作、命令等,通过必要的设置,就可以直接实现与其他语言的混合编程,而不必依赖matlab环境,前提是必须要有两个动态链接库mdv4300.dllago4300.dll

1.4利用com组件技术

comcomponent object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用。Matlab6.5新推出的com builder就是把matlab下的程序做成com组件,供其他语言调用。

matlab com builder在编译生成com组件的时候需要借助于外部的编译器。因为并不是所有的编译器都能生成和microsoft相兼容的com组件。com builder目前支持下列编译器:Borland c++ builderMicrosoft Visual Studio 6.0, Microsoft Visual Studio .net等。设置matlab com builder所使用的外部编译器,可以通过在matlabcommandwindow中输入命令MBuilder-setup来实现编译器的设置,具体步骤只要按照matlab提示进行即可。

2  matlabcom builder 使用方法

我们先将一个图片放入c盘下,命名为1.jpg,再准备一个测试文件test.m,如下:

%读入并且显示图片

function rs_jpg

I=imread(‘c:.jpg);

Imshow(I);

然后,在matlabworkspace下输入comtool,就可以启动matlab com builder环境。点击工具栏上的File菜单下的new project新建一个工程,在component name栏里填上comtest,将classes栏里自动生成的comtest类删除,class name里填上一个testclasscompile code incc++都可以,不过因为c性能较好,推荐选择c。如果使用matlab里的图形库,需要在compiler options中选中Use Handle Graphics Library,我们使用了图形功能,故选中该项。选中Build debug version会生成调试版本的com组件,在调试的时候,调试版本的com组件如果真有错误发生,就会有相应得错误提示信息,可以方便地定位错误发生的地方。选中Show ……可以在编译生成com组件的时候输出详细的过程信息。在工程创建制后,仍然可以通过菜单Project->setting…打开此窗口进行修改。

Matlab下可以给com组件中的类添加方法。具体操作如下:

使用菜单Project->Add File或者点击按钮Add File添加已经存在的m函数文件就可以了。在这里,我们点击Project->Add files,将test.m添加如工程。方法(函数)添加完后,就可以使用菜单Builde->Com Object或者按钮build进行编译。编译完后就会在matlab工作目录下的comtest目录下生成两个文件夹:一个是srv,里面存放一些中间文件;另一个是distrib,里面就是动态链接库形式的com组件文件等。在这里,编译后distrib\文件夹下生成一个comtest_1_0.dll,这就是做好的com组件。

3 调用com组件的方法

3.1 vb下实现调用

   打开或者新建一个vb工程,点击project->reference,在弹出的窗口中找到comtest 1.0 Type Library,将左边的复选框选中,点击ok,此时便将此com组件添加到工程里了。

   示意调用代码如下:

   Dim testclass As testclass

   Set testclass1=New testclass

   Call testclass1.rs_jpg

3.2 c#.net下实现调用

   打开或者新建一个c#项目(这里采用vs.net),选中右边的解决方案资源管理器中的引用,点鼠标右键,选添加引用,在弹出窗口中选com,然后也找到comtest_1_0.dll,选择并确定即可。

   示意调用代码如下:

   omtest.testclasstestclass1=newcomtest.testclass();

testclass1.rs_jpg();

3.3 vc下实现调用

   点击vc下的tools->ole/com objectviewer打开oleviewer工具,在oleviewer工具的右边选择type libraries,找到comtest 1.0 type library,选中并且右键,选择view,点save按钮,分别保存为comtest_1_0.hcomtest_1_0.c(也可以存为comtest_1_0.idl接口文件),我们就可以根据这两个文件实现对comtest_1_0.dll调用。

新建或打开一个vc工程,将comtest_1_0.hcomtest_1_0.c加入工程,并复制一个comtest_1_0.dll到工程目录下,由于comtest_1_0.dll还要用到mwcomutil.dll,所以将<matlabroot>

/extern/include/下的mwcomutil.hmwcomtypes.h也加入工程中。

示意调用代码如下:

#import “mwcomutil.dll”

#import “comtest_1_0.dll”

#include “mwcomutil.h”

#include “comtest_1_0.h”

//初始化调用com

if (FAILED(CoInitialize(NULL)))

  {

    AfxMessageBox(“unable to

initialize COM”)

}

testclass *testclass1=NULL;

HRESULT hr=CoCreateInstance(CLSID_testclass,    NULL,CLSCTX_ALL,IID_ testclass,(void**)&st);

if (SUCCEEDED(hr))

  {

    st->rs_jpg();

    AfxMessageBox(“succeed”);

    st->release();

}

else

  {

   AfxMessageBox(“unsucceed”);

}

3.4 delphi下实现调用

   点击delphiproject->import type library…,出现图形窗口,找到testclass 1.0 type library,然后点击”install…”按钮,就在testclass控件页上安装了testclass控件。

   打开或建立一个工程,在form上放一个testclass控件和一个按钮控件,然后在按钮相应事件中添加如下代码:

   Procedure TForm1.Button1Click(SenderTObject);

   Begin

     Testclass1.rs_jpg;

   End;

4 打包

  matlab下的workspace里输入comtool,选择菜单flile->open project打开我们建好的工程文件comtest.cbl,再选择菜单component->package component就实现了打包。此时,可以在comtest\distrib文件夹里看,生成的comtest.exe就是打包后的解压程序,双击就会解压出一些文件,再点击解压出来的install.bat就可以实现安装。

5 结束语

通过应用编程接口,可以把其他高级语言灵活多变的编程能力和matlab的强大计算能力结合起来。matlabcom builder工具可以方便地把matlab程序做成com组件,为系统开发人员提供了简单、易用地应用程序接口。和其他接口方法相比,将matlab程序做成com组件,使其他语言工具和matlab的混合编程更加简单。

参考文献

[1]韩守红等.DelphiMatlab接口的实现方法研究.微计算机信息.2001

[2]胡劲松等.基于COMMATLABDelphi混合编程研究.计算机应用研究.2005

 


阅读全文(3178) | 评论:2 | 复制链接