使用MATLAB Engine实现与C混合编程

By | 04月15日
Advertisement

(hplonline)2009.11.10

》》目的:

1.实现快速结果验证
2.方便的矩阵运算
3.方便的绘图模块

》》环境:

VISTA+MATLAB2009a+VC6.0

》》资料:

以安装路径“E:Program FilesMATLABR2009a”为例

MATLAB外部支持文件夹:
E:Program FilesMATLABR2009aextern
matlab自带的c例程:
E:Program FilesMATLABR2009aexternexampleseng_mat

engine.h的位置:
E:Program FilesMATLABR2009aexterninclude

各种lib的位置:
E:Program FilesMATLABR2009aexternlibwin32microsoft

在matlab帮助中输入“C language”即可找到有关MATLAB Engine的一个页面。
从这个页面开始,学习各种关键词,
就能够找到一切你需要的资料。

使用MATLAB Engine一般用两套函数就可以了。
1.engXXXX,关于Engine本身的操作,包括打开/关闭,设置/取得变量,执行语句等等。
2.mxXXXX,关于数据类型mxArray的操作,与MATLAB交互的左右类型全部为mxArray。

》》一个搭建实例

先在VC6的tools->options->directories里添加相关目录

include files:
E:Program FilesMATLABR2009aexterninclude

library files:
E:Program FilesMATLABR2009aexternlibwin32microsoft

做好这些后,如果我们环境一样,
下面的代码应该能够编通并且正常执行,
其中包含了常用的一些函数,
一般来说使用Engine的时候也就用这些了。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "engine.h"
#include "matrix.h"

#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmx.lib")

int main()
{
Engine *ep;
int i , j ;

//show how to open MATLAB engine
//for remote ones:
//engOpen( ADDRESS OF REMOTE SYSTEM ) ;

if (!(ep = engOpen(""))){
fprintf(stderr, "nCan't start MATLAB enginen");
return EXIT_FAILURE;
}

//show how to create matrix
mxArray *Y = mxCreateDoubleMatrix(1 , 3 , mxREAL) ;

//show how to put data in matrix
double tmp[3] = {1.0 , 2.0 , 3.0} ;
memcpy(mxGetPr(Y) , tmp , sizeof(tmp)) ;

//show how to put variables in the Engine
engPutVariable(ep , "Y" , Y) ;

//show how to execute commands in MATLAB
engEvalString(ep, "X = ones(5,1) * Y");

//show how to get variables from the Engine
mxArray *X = engGetVariable(ep , "X") ;

//show how to manipulate dimensions
int dims[10] ;
int ndims ;
ndims = mxGetNumberOfDimensions(X) ;
printf("total number of dimensions is %dn" , ndims) ;
memcpy(dims , mxGetDimensions(X) , ndims * sizeof(int)) ;
for ( i = 0 ; i < ndims ; i ++ ){
printf("dimension %d : %dn" , i , dims[i]) ;
}
printf("n") ;

//show how the data is stored in the memory
double *p = (double*)mxGetData(X) ;
for ( i = 0 ; i < dims[0] ; i ++ ){
for ( j = 0 ; j < dims[1] ; j ++ ){
printf("%8.2f" , p[j * dims[0] + i]) ;
}
printf("n") ;
}

//---important, to release resources
mxDestroyArray(X) ;
mxDestroyArray(Y) ;

//show how to hide and unhide MATLAB command window
printf("type RETURN to hide the MATLAB command window...n") ;
getchar() ;
engSetVisible(ep , false) ;
printf("type RETURN to unhide the MATLAB command window...n") ;
getchar() ;
engSetVisible(ep , true) ;

printf("type RETURN to END this program...n") ;
getchar() ;
//remembering to close it is important .
//but if you are debugging your programs ,
//annotate the following line will save you a lot of time ,
//for you needn't to restart the Engine .
engClose(ep) ;

//when your work is accomplished , type "exit" in MATLAB command window

return EXIT_SUCCESS;
}

》》某些问题

如果出现这个:

engdemo.obj : error LNK2001: unresolved external symbol _engClose
engdemo.obj : error LNK2001: unresolved external symbol _engSetVisible
engdemo.obj : error LNK2001: unresolved external symbol _mxDestroyArray
engdemo.obj : error LNK2001: unresolved external symbol _mxGetData
engdemo.obj : error LNK2001: unresolved external symbol _mxGetDimensions_730
engdemo.obj : error LNK2001: unresolved external symbol _mxGetNumberOfDimensions_730
engdemo.obj : error LNK2001: unresolved external symbol _engGetVariable
engdemo.obj : error LNK2001: unresolved external symbol _engEvalString
engdemo.obj : error LNK2001: unresolved external symbol _engPutVariable
engdemo.obj : error LNK2001: unresolved external symbol _mxGetPr
engdemo.obj : error LNK2001: unresolved external symbol _mxCreateDoubleMatrix_730
engdemo.obj : error LNK2001: unresolved external symbol _engOpen

其实就是lib没有添加好。

在代码中写上:
#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmx.lib")
就可以了。

或者可以在工程的连接设置里面添加这两个库。
不过我倾向于前者,这样在发布源码的同时,
就尽最大可能地保证能够编译,
而不用其他人学习的时候再去设置。

当然,由于#pragma是由编译器自己决定的,
所以代码的可移植性存在一些问题。

如果还是报上面的错误,估计是没有将lib的路径添加对。
具体参考上面的那个实例,然后注意把路径换成自己机器上的。

》》小结

前几天围观了一个人用MATCOM混编,
发现确实很混。。。
比如调用rand的时候,直接就被MATLAB的rand给覆盖了。
因为他的头文件里面有类似
#define rand randM ?????
这样的东西,
于是在编译器接到代码之前,该代码已经被预处理替换了。
这样根本不会出现函数重复的编译或者连接错误。
这在某种意义上带来了一些隐患,影响调试。
(当时帮他看了半天才反映过来。。。)

使用MATLAB Engine的话,双方代码的隔离性很好。
由于使用字符串进行代码交互,开发效率可能会低一点。
另外在数据交互上比较麻烦一点,需要mxXXX系列的函数。

用MATCOM的时候甚至可以直接写出
mVar = CVar ;
这样的赋值。。。
由已经实现好的强大的类库来完成底层的转换。

Similar Posts:

  • Matlab R2010a和vs 2010混合编程

    from:http://www.ilovematlab.cn/thread-205148-1-1.html 环境:Matlab R2010a,vs 2010 c++,XP, 32位操作系统 MatlabR2010a与vs2010 c++混合编程成功,在vs2010 c++中能够调用matlab的m函数,进行计算,得到正确结果,调用matlab中m函数转化成的dll文件 一.matlab编译环境的设置 >>mex –setup Pleasechoose your compiler for bui

  • 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

    本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[原创]Matlab.NET混编技巧之--找出Matlab内置函数中,已经大概的介绍了matlab内置函数在混合编程中的优点,并通过程序找出了matlab中的大部分内置函数,当然更多人关心是如何像我所说得那样,不用直接编译,就直接在C#中调用这些内置函数.本文就带你揭开这些谜团. 声明,这篇文章是需要一点点混合编程基础的,基本概念和过

  • Matlab中的多CPU并行计算:一种基于Matlab引擎的混合编程方法

    发信人: frozensea (冰冻之海), 信区: MathTools 标 题: [原创]Matlab中的多CPU并行计算:一种基于Matlab引擎的混合编程方法 发信站: 水木社区 (Wed Oct 31 10:14:27 2007), 站内 [原创]Matlab中的多CPU并行计算:一种基于Matlab引擎的混合编程方法 2007-10-31, by FrozenSea 实验室新购置了一台双核本本,就忍不住琢磨一下,好使得我那Matlab下的程序更有效率. 然而Google下来却收获甚微,

  • 浅析VC++与MATLAB混合编程方法在图像处理中的应用(转载)

    一.引言 Visual C++是一种可视化编程语言.它集成了功能强大的编辑器.编译器.链接器.调试器.App Wizard.Class Wiz?鄄ard.AppStudio等多种多样的可视化编程工具,利用它可以完成各种应用程序的开发.此外Visual C++语言与其它高级语言相比有很高的代码执行效率.但是在编写例如数字图像处理方面的程序时就需要比较复杂的算法,编写得不好就会影响程序的运行速度. Matlab是一种高性能的数值计算和可视化编程软件,在数值分析.信号处理.系统辨识.特殊函数和图形处理

  • VC与Matlab混合编程 及复杂数据:结构体传递

    本文主要介绍VC与Matlab混合编程的两种方法,并详细介绍了VC向Matlab传递复杂数据:结构体的方法,有详细代码说明. Matlab 主要面对科学计算.可视化以及交互式程序设计的高科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,将二者结合共用,各献其长,可以为科研工作和工程开发提供更为强大的技术支持. Matlab作为控制系统设计的一种通用工具,它可以很方便的和VC

  • MATLAB 混合编程

    原文地址:http://www.cnblogs.com/xfzhang/archive/2010/12/20/1912214.html 上篇:被其它编程语言调用 Matlab Compiler(编译器)或mcc的使用--个人认为是正道 1.设置编译器: http://www.cnblogs.com/fence/archive/2010/10/16/1853276.html 首先需要配置自己的Matlab Compiler,Matlab Compiler的作用是将程序编译成为机器可以直接执行的程序

  • VC++;Matlab;混合编程

    Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析.优化.统计.偏微分方程数值解.自动控制.信号处理.图像处理等若干领域的计算和图形显示功能.其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径. 但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作

  • matlab与C/C++混合编程方法

    Matlab是一个具有强大的矩阵运算.数据处理和图形显示功能的软件,其输出结果可视化,编程效率极高,极少的代码即可实现复杂的运行,然而其边解释边执行,运算效率较低,实现相同功能的代码跟其他编程平台相比运行时间相对较长,且不适合作为通用的编程平台.因此,许多Matlab的应用程序需要使用诸如VC之类的通用编程平台,实现Matlab与VC的混合编程,这样有助于发挥Matlab和VC的各自优势. 集成的几种实现方法 为了实现混合编程,Matlab 5.0以后版本自带了C语言编译器(Compiler),

  • 引用 VC和Matlab混合编程

    引用 网易博客 的 VC和Matlab混合编程 VC调用Matlab的方法有多种,为了对混合编程有一个大概认识,将常用的几种方法中介绍一下: 一.通过Matlab Engine方式 Matlab Engine是指一组Matlab提供的接口函数,支持C语言, Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受数据信息

  • matlab和c++混合编程---方法和步骤

    摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义.从Matlab调用C/C++代码及C/C++调用m文件两方面,深入地研究了它们之间混合编程的原理和实现机制,并且给出了具体条件下的混合编程方法和步骤.实验表明,给出的Matlab与C/C++混合编程接口及应用方法是有效.实用的. 1引言 Matlab是当前应用最为广泛的数学软件,具有强大的数值计算.数据分析处理.系统分析.图形显示甚至符号

Tags: