摘要:本文主要讨论了VC++与Matlab混合编程的两种常规方式,给出了利用Matlab数学函数库混合编程的实现方法,指出了常规方式存在不足的同时,提出了另外两种方法,实现了利用Matlab数学函数库和编译器结合VC++混合编程的新方法,充分发挥了VC++有效运算速率与Matlab强大矩阵运算的优点。实验结果说明本文所提方案可行,适用于图像处理。
关键词:Matlab; VC++; 混合编程; 数学函数库; 编译器
1. 引言
Matlab是Mathworks公司推出的一套工程计算及数值分析软件。由于功能强大、易使用,得到了广泛应用,特别是在图像信号处理,语音信号处理,信号分析等领域充分展示了其强大的矩阵运算功能。虽然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版本以后已停止开发;Matlab和Matcom所封装的数学函数库提供了大量的实用函数,可以完全脱离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在内存中的存储顺序为:1、2、3、4、5、6,即按行优先的原则进行存储。在Matlab环境中,数组a在内存中的存储顺序为:1、4、2、5、3、6,即按列优先的原则进行存储。
利用以上两种数学函数库的混合编程,都能带来算法上的极大简化,但也有几点不足:
1) 两种数学函数库下矩阵操作均需通过各自的函数进行,对于经常使用Matlab开发算法的程序员来说,使用时会带来一定程度的麻烦,且VC++环境下矩阵操作相对Matlab环境不够灵活。
2) 而最大的问题在于,两种数学函数库所封装的函数远远少于Matlab环境下的函数库,不能充分发挥Matlab强大的矩阵计算功能,尤其是其中的工具箱函数,而工具箱函数却是我们实际应用中经常需要用到的。因此如何更好的利用Matlab环境下优秀的矩阵运算及强大的工具箱函数,是本文讨论的另一个重点。
3. 两种混合编程新途径
1) 利用matlab环境下的Mat文件进行不同编程环境下的数据交互。
Mat文件是Matlab系统保存文件的默认文件格式,文件存储为二进制格式,可以利用其在不同平台或不同应用程序间传递数据。Matlab环境下mat.h文件包含了mat文件的创建、读写等函数的定义。利用mat文件可以提供复杂的准备数据、处理VC++环境下的中间数据、及进行后期处理数据的准备,如本次实验中利用了Matlab工具箱中的滤波器工具箱创建了一个大小为
此种方法的缺点是不便于用户的交互,只在某些特殊场合下需要,如提供复杂的初期准备数据时,这里我们主要讨论下面这种混合编程的方法。
2) 利用Matlab编译器将M文件自动转换成C或C++文件。
Matlab编译器是MathWorks公司为Matlab开发环境提供的一个软件工具,利用它可将Matlab环境下的M文件转换成C或C++源代码,这些源代码可以再被编译链接生成VC++环境下可执行程序或动态链接库。这种方式主要有以下三个优点:
1) 使程序的执行效率大大高于在Matlab环境下M文件的执行效率,尤其是在M文件中包含了大量的循环语句时。
2) 隐藏了算法的私人拥有权,因为Matlab的M文件是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.cpp和myimnoise.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)
其中
1) 由于影像象素的数量多,即使是对一般分辨率的影像而言,问题的尺寸也会非常的大。
2) 在
3) 虽然TV有稳定性,对于线性化后的线性系统,如果
由上分析可知总变分方法在数值求解上是比较困难的:如在VC++环境下实现,需要进行大量的内存操作,傅利叶变换,及二维卷积等实现。而采用VC++与MATLAB混合编程时,一是可以利用其运算精度高,特别是其运算结果的可视化功能便与算法调试。二是由于该语言的基本编程单元是矩阵,而图像的数据结构亦是矩阵(二维数组),而且VC++是对图像是逐像素操作,对于一幅普通分辨率的图像来说,处理起来运算量也非常地大,因此采用矩阵处理图像是非常合适的。三是可以充分利用其图像处理工具箱软件提供了大量对图像进行常规操作的命令如快速傅利叶变换、卷积计算等,这些命令都是由图像处理方面的专家撰写的,具有高度的稳定性和可靠性。

图2为本次实验结果,从处理的最终结果来看,基本上实现了模糊图像的超分辨率重建,达到了图像增强的目的;从时间代价上来看,如在Matlab环境下处理这样一幅
4、 结论
由上述论述可知,在进行Matlab和VC++混合编程进行图像处理时,一方面可充分利用两种数学函数库的强大功能,直接在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.


评论
我想学习混合编程,您能把"一个应用混合编程处理天文图像的例子“也给我发一份吗?
谢谢,不胜感激!
我的邮箱 112809803@qq.com