Matlab与VC混合编程

原创 2006年05月19日 14:42:00

MatlabVC混合编程

众所周知,MATLAB是一套功能非常强大的商业数学软件,从信号处理,语音处理,数据采集,数值运算,图像处理,到电子仿真,金融分析等等,几乎在各个工业领域,他都已经得到了广泛应用,同时也取得了巨大的成功。

但是,由于Matlab是用一种脚本语言,他的解释是逐行执行的,程序中所有的变量都是用MxArray来实现的,所以为了保证通用性,它的执行效率非常低,这就是我们常常看到的:在开发一些复杂的算法时,通常会发现程序执行得特别慢,虽然Mathworks公司已经在竭力提高m脚本文件(script files)的运算速度,但目前为止效果仍然不能和实现同样功能的可执行程序相比。而且m脚本文件是不能脱离Matlab这个应用程序环境,这就大大制约了程序的可移植性和通用性。

本文的目的正是基于上述考虑,介绍如何利用matlab提供的C/C++编译器,将m文件编译成可执行的应用程序。编译环境是:MS VC++ 6.0Matlab6.5

一、    MATLAB中的操作

1.没有使用图形相关的函数

由于MATLAB的编译器只能对函数m文件进行编译,所以如果原来的程序是脚本程序应改写成函数形式。举例如下:

建立一个m文件test1.m,内容如下:

function y = test1(n)

y = 1 ;

for i = 1 : n

   y = y * i ;

end

用如下命令对其进行编译:

mcc t L CPP h test1.m

(如果程序由多个m文件组成,在编译命令中只需要指定主文件即可,mcc会自动查找相应的m文件进行编译)编译完成后会得到与m文件名相对应hppcpp文件,本例中是test1.hpptest1.cpp

2 使用了图形相关的函数

建立一个m文件test2.m,内容如下:

function test2

plot(rand(10));

用如下命令编译:

mcc p B sglcpp test2.m

(如果程序由多个文件组成,处理方法同上)

编译完成后得到与m文件名相对应的hppcpp文件、一个主函数文件、bin目录中的两个Fig文件以及一个exe文件。我们需要的只是与m文件相对应的hpp文件、cpp文件以及bin目录中的两个fig文件,本例中是test2.hpptest2.cpp以及bin目录中的FigureMenuBar.figFigureToolBar.fig 

二、VC中的操作

相比MATLAB中的操作,VC中需要设置众多的编译选项,显得比较复杂。另外,VC中可选的工程类型比较多,本文将说明MATLAB编译得到的源程序在如下工程类型中的使用

l         MFC Appwizard(exe) (Dialog Based)

l         Win32 Console Application

l         Win32 Application

其实在这几种类型的工程中大部分的操作都是相同的,本文先描述相同的操作,再说明不同的部分。

1.用VC建立相应类型的工程,把第一步中提到的源程序拷贝到工程所在目录中。

2.选择菜单ToolsOptions-在属性页中选择Directories-下拉框中选择Include Files,在其最后加入

%MATLAB6P5%/EXTERN/INCLUDE/CPP

%MATLAB6P5%/EXTERN/INCLUDE

其中%MATLAB6P5%MATLAB的安装路径,如下图所示:

再在下拉框中选择Library Files,在最后加入

%MATLAB6P5%/EXTERN/LIB/WIN32/MICROSOFT/MSVC60

%MATLAB6P5%/EXTERN/LIB/WIN32

如下图所示:

3.选择菜单ProjectSettings-属性页Link-下拉列表中选择Input,在Object/library modules文本框中加入 libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib  sgl.lib libmwsglm.lib libmwservices.lib

注意下面的Ignore Libraries文本框,这里需要根据不同的工程类型进行填写,稍后再分情况说明。如下图所示:

4.选择C/C++属性页,在下拉列表中选择Preprocessor,在Preprocessor definitions中加入MSVC,IBMPC,MSWIND如下图所示:

再在下拉框中选择Precomplied Headers,选中Automatic use of precompiled headers,在其中填入stdafx.h,如下图

5.选择菜单ProjectAdd To ProjectFiles把所有拷贝过来的cpp文件加入到当前工程中。

 

下面再依各种不同类型的工程具体说明

1.    MFC Appwizard(exe) (Dialog Based)

(仅以带图形函数的为例,所以需要把test2.hpptest2.cpp以及两个fig文件拷贝到当前工程中)在主对话框上添加一个Button,并添加按钮的相应函数OnButton1

在按钮响应函数所在文件中添加如下代码:

#include "test2.hpp"

在按钮相应函数中添加如下代码:

test2();

在对话框类的OnInitDialog函数中添加如下代码:

libmmfileInitialize();

libmwsglmInitialize();

mlfHGInitialize(NULL,NULL);

在对话框的消息WM_DESTROY的处理函数OnDestroy()中加入如下代码:

mlfHGTerminate();

    libmmfileTerminate();

    libmwsglmTerminate();

在上面提到的Ignore Libraries里加入msvcrt.lib,此时即可以编译成功了。

2.    Win32 Console Application

这里建立了一个支持MFC的程序,以不带图形的函数为例,把test1.hpptest1.cpp拷贝到当前工程中,

#include "stdafx.h"下面加入

#include "matlab.hpp"

#include "test1.hpp"

// TODO: code your application's behavior here.下面加入如下代码:

mwArray y,n;

        n = 3;

        y = test1(n);

        double *py = mxGetPr(y.GetData());

        printf("%f/n",*py);

    在上面提到的Ignore Libraries里加入msvcrt.lib,由于MATLAB的库函数与VC的输入输出函数coutcincerr冲突,所以需要把MFC生成的代码中

    cerr << _T("Fatal Error: MFC initialization failed") << endl;一行删掉,并且在以后的代码中页不能有coutcincerr

  1. Win32 Application

选择建立"A simple Win32 Application",这样的工程中默认是没有主窗口的,只有一个WinMain函数,以带图形的函数为例,把test2.hpp test2.cpp以及

    FigureMenuBar.figFigureToolBar.fig拷贝到当前工程中。

       #include "stdafx.h"下面添加

#include "test2.hpp"

    WinMain函数中添加如下代码:

libmmfileInitialize();

    libmwsglmInitialize();

    mlfHGInitialize(NULL,NULL);

    test2();

    mlfHGWaitForFiguresToDie();

    mlfHGTerminate();

    libmmfileTerminate();

libmwsglmTerminate();

此时编译能够成功,但会出现两个警告信息,在Ignore Libraries里加入msvcrt.lib,libcd.lib即可去除该信息。

三、程序的发布

由于程序中调用了MATLAB数学函数库或图形库中的函数,所以需要附带MATLAB的这些函数库才能在没有安装MATLAB的机器上运行。幸好MATLAB已经把这两个库的函数打包了,这样就省得我们一个一个去搜集了。该文件就是位于matlab安装目录中extern/lib/win32子目录中的mglarchive.exe。运行该程序即可自动把需要的库函数解压到当前目录中,把编译好的程序放到该目录中拷贝到未装matlab的机器上即可实现脱离matlab

VC+Matlab混合编程经验总结

      用过matlab的人都会惊叹它在数值处理和绘图方面的强大,可一般用户使用它还是感到有些难度的。能不能利用matlab做出让一般用户都能操作、界面简单友好的程序出来呢?本文尝试的就是一种把m...
  • sworder_001
  • sworder_001
  • 2006年12月11日 21:48
  • 2065

Matlab与VC混合编程之二

Matlab与VC混合编程之二 1. 待解决的新问题 在《Matlab与VC混合编程之一》中我们已经实现了在VC中调用Matlab编译M文件生成的COM的方法,并成功的进行了计算并绘制一个点。接下来...
  • zhangkunhn
  • zhangkunhn
  • 2013年07月01日 23:59
  • 845

基于COM接口的VC++与MATLAB混合编程

基于COM接口的VC++与MATLAB混合编程 http://www.cppblog.com/3522021224/archive/2007/06/11/26046.html 0  引言    ...
  • pinellina
  • pinellina
  • 2015年12月02日 13:31
  • 1290

MATLAB与VC++混合编程(1)——在MATLAB下调试C/C++程序

如果你有一个C/C++的函数需要测试,利用MATLAB平台是一个经济高效的选择。你不必花过多的精力去理会IO的问题,并且可以很方便的利用 MATLAB的函数来验证你的函数的正确性。有时,你还可以利用M...
  • bourbaki
  • bourbaki
  • 2007年06月27日 14:01
  • 4538

VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)

这是师兄们在实际项目中用到的关于VC++和MATLAB混合编程的实例。最近自己在瞎鼓捣,也就研究了下这块,本想写篇博文,但网上这块的资料还算是比较多,写的也比较具体,想着不重复劳动,因此我也就不写了。...
  • u010412719
  • u010412719
  • 2015年08月25日 20:01
  • 1257

matlab与VC混合编程出现的问题

今天是周三,一周过去的这三天一直在正matlab和VC6混合编程的问题。问题最终解决,得到的经验教训也不少。 网上有很多混合编程的资料,首先要弄清楚选择哪种方式,这方面后续会总结。 在VC6中C和...
  • Angelahhj
  • Angelahhj
  • 2014年11月26日 19:49
  • 741

MFC和Matlab的混合编程入门

这个过程也是照着别人博客做的。 因为要做一些MFC和matlab的混合编程的事情,三天前在那里胡搞。 装了Matlab2012 编译成dll后,由于一些步奏不对,机缘巧合中发现了VC的bug,无奈卸掉...
  • crazyacm
  • crazyacm
  • 2014年01月09日 15:59
  • 1414

Matlab R2012a和vs 2010混合编程

环境:Matlab R2010a,vs 2010 ,win7, 64位操作系统 假设有一Matlab函数文件 MyAdd.m,内容如下: function c = MyAdd( a,b )...
  • liulina603
  • liulina603
  • 2017年01月17日 14:54
  • 1362

C/C++与Matlab混合编程初探

Matlab 拥有丰富的功能,编程简单。不过,有些情况下,Matlab程序的执行速度比较慢。C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些。因此存在一种方案,就是使用Matlab...
  • bendanban
  • bendanban
  • 2014年07月15日 21:42
  • 27452

C#与MATLAB混合编程

C#调用MATLAB画图,混合编程,.Net FramWork平台导致的出错。
  • liu16659
  • liu16659
  • 2016年09月05日 18:09
  • 4045
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Matlab与VC混合编程
举报原因:
原因补充:

(最多只允许输入30个字)