【转】C++调用Matlab的.m文件

原文地址

Matlab是一个强大的数学计算/仿真工 具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数。但在很多情况下,我们不得不使用VC编程。那么,如何在VC中利用matlab的 资源呢? 在这里我简要的以一个简单的例子来说明一下如果在VC中调用matlab中定义的.m文件。繁多的理论就不说了,简明扼要的说一个实例。相信大家看过之后 都会马上学会的

其中灰色底显示的部分是需要我们手工输入的部分。

步骤如下:

㈠当然是先建立matlab的m文件。

这里为了简单起见,我在matlab中定义了一个函数, 其m文件如下:

function y = add_zh(a,b)

y=a+b

保存为myfunct.m

㈡下面来对matlab编译环境进行设置。

打开matlab,在命令行状态下键入:mex-setup

然后出现如下提示:

--------------------------------------------------------------------------------------

Select a compiler:

[1] Borland C++Builder version 5.0 in C:\Program Files\Borland

[2] Lcc C version 2.4 in F:\SOFT\SHARE\MATLAB65\sys\lcc

[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

Compiler:

--------------------------------------------------------------------------------------

这里我们选择’3’。(如果使用其他的编译器比如BCB,那么就可以相应的选择’1’)

然后,继续在命令行状态下输入:

mbuild –setup

--------------------------------------------------------------------------------------

Please choose your compiler for building standalone MATLAB applications:

Would you like mbuild to locate installed compilers [y]/n? y

Select a compiler:

[1] Borland C++Builder version 5.0 in C:\Program Files\Borland

[2] Lcc C version 2.4 in F:\SOFT\SHARE\MATLAB65\sys\lcc

[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

Compiler:

--------------------------------------------------------------------------------------

这里需要几步确认。大家按情况操作即可。

㈢对VC的编译器环境进行设置。

在Tools-options-directory里面设置include和lib的路径,分别添加一项,指向matlab安装目录中的\extern\include和 \extern\lib

㈣将.m文件编译为动态链接库

这一步比较关键。在这一步中,将matlab中的.m文件转换为dll。

在matlab命令行中输入:

mcc -t -h -L C -W lib:ppp -T link:lib
myfunct.m

至此,可以发现在myfunct.m所在的目录中产生了一大堆文件。我们只用其中3个:

ppp.h   
ppp.lib    
ppp.dll

㈤ 测试与调用

1. 新建一个VC工程。这里取名为mat。为了简单,我们在这里建立一个对话框来进行演示。如下:

然后,将上面这3个文件拷贝到VC工程所在的目录中,以便VC调用之。

2. 进行VC编程。

首先,在cpp文件中加入: #include
“ppp.h”

然后,设置VC的链接库。在project-settings-link下的object/library
modules中加入:

ppp.lib
libmx.lib libmatlb.lib libmmfile.lib

至此,VC的编译环境设置完毕。下面就是编程部分了。

3. 编程部分的关键:接口和数据类型的转换

先给出VC实现的源代码:

void CMatDlg::OnButton1()
{           //在matlab中定义的m文件:myfunct,其功能是完成两个数的相加操作。
                CString str;
            UpdateData(true);
            pppInitialize();
            //为了调用matlab中的函数,必须使用数组数据类型,并其后调用matlab函数将其转化为矩阵格式(matlab的基本数据类型是矩阵)
            static double x1[1]={1.0};
            static double x2[1]={2.5};
            double result;
            //调用matlab创建3个矩阵
            mxArray *A=mclGetUninitializedArray();
            mxArray *B=mclGetUninitializedArray();
            mxArray *C=mclGetUninitializedArray();
            //将C语言中的变量值赋给matlab中的矩阵
            mlfAssign(&A,mlfDoubleMatrix(1,1,x1,NULL));
            mlfAssign(&B,mlfDoubleMatrix(1,1,x2,NULL));
            mlfAssign(&C,mlfMyfunct(A,B));
            //将matlab中的矩阵的指针传递给C语言中的指向double的指针
            double * md=mxGetPr(C);
            result=md[0];
            //释放这些矩阵
            mxDestroyArray(A);
            mxDestroyArray(B);
            mxDestroyArray(C);
            str.Format ("It is : %f",result);
            ::AfxMessageBox(str);
}

相信看到里面的注释,我们就明白的差不多了。

VC编程以实现对matlab函数的调用,例如VC中我们实现两个double型的相加,则需要做上述的编程:首先定义两个数组并存入我们要进行函数操作的数据(也就是所谓的实参);然后将这两个数组转换为matlab可以识别的矩阵;然后调用m文件中自定义的函数,对矩阵进行操作;最后将结果再转回VC支持的数据格式:

double * md=mxGetPr(C);

result=md[0];

至此,经matlab函数处理过的数据已经存入了VC中的result变量。

mlfAssign(&C,mlfMyfunct(A,B));

大家可以看出来,在进行调用的时候,我们使用的是m文件的文件名myfunct,而不是m文件中定义的add_zh(a,b)

程序中,我们要实现1.0和2.5的相加运算,结果如下:

。。。

运行报错:e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) :
error C2065: ‘REFCLSID‘ : undeclared identifier
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) :
error C2146: syntax error : missing ‘)‘ before identifier
‘clsid‘
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) :
error C2182: ‘mclCLSIDtochar_proxy‘ : illegal use of type
‘void‘
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1764) :
error C2059: syntax error : ‘)‘
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1768) :
error C2065: ‘REFGUID‘ : undeclared identifier
e:\program files\matlab\r2009a\extern\include\mclmcr.h(1768) :
error C2146: syntax error : missing ‘)‘ before identifier
‘guid‘
未解决

时间: 2024-10-15 23:18:09

【转】C++调用Matlab的.m文件的相关文章

VB.NET 调用MATLAB的M文件(生成COM控件)

一.版本说明:VS2008,MATLAB2010b 二.安装MCRInstaller 在路径C:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win32下 三.在MATLAB命令窗口中配置环境 1. 输入: mbuild –setup 出现以下界面,我选择的是[2]自己的编译器,不是MATLAB自带的. 2.打开下图 3.然后弹出以下对话框 名字自己命,我的叫recognition.选择Generic COM Component.点击

Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码,保存为m文件1 1.3. 通过cli接口调用Matlab执行m文件1 1.4. 效果如图1 1.1. 边缘检测的基本方法Canny最常用了 1.2. 编写matlab边缘检测代码,保存为m文件 fprintf('Hello World'); imag = imread('C:\00edge\a.jpg');  %读取 imag = rgb2gray(imag);        %转化为灰度图 %imag_f

c++与matlab联合编程,调用Deploytool 生成exe文件和dll文件(转)

转自:http://www.cnblogs.com/xlw1219/archive/2012/12/25/2832222.html 首先必须知道联合编程需要知道的一些命令解释: mcc 的作用是将 .m文件编译为 c/c++动态链接库文件,使你可以在 c/c++程序中使用 matlab的一些函数功能.mcc 也可以将.m文件编译为exe可执行文件. mex 的作用是将 c/cpp文件编译为 .m  文件可以调用的库文件,在Windows操作系统里通常是以mexw32或mexw64为扩展名,让你可

asp.net下调用Matlab生成动态链接库

对于这次论文项目,最后在写一篇关于工程的博客,那就是在asp.net下调用matlab生成的dll动态链接库.至今关于matlab,c/c++(opencv),c#(asp.net)我总共写了4篇配置的博客,配置问题搞了我们差不多2周多的时间,各种编译不通过,各种链接出问题,各种头疼,甚至都有放弃asp.net下建工程,转用matlab的gui来实现前端界面的念头了.但是在队友的强烈要求下,我不得不硬着头皮搞下这配置问题,最终总结出这4篇配置博客.其中艰辛,恐怕连队友都不甚了解. 当然在实验室同

Windows、Linux、Web安装及调用Matlab程序完整说明(大章)

本文档详细说明了Linux下Web项目调用Matlab函数的完整操作,文章适合对Java.Linux有一定基础了解的人群(不了解也没什么,无非是多试几次).因Linux作为服务器,所以未在其上安装Matlab主程序,只安装了运行环境MCR. 本文档内所述的所有版本软件均以32位为准,JDK与MCR也使用32位.若你的系统为64位,Linux系统同样为64位,则请尽量选择使用64位版本的JDK与MCR. 由于Matlab的版本限制问题,请保证Matlab主程序和MATLABCompiler Run

安装及调用Matlab程序可能存在的问题解决办法

无法执行本地调用Matlab函数JAR包,容易出现的问题 a检查你的环境变量Path: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; F:\Program Files\MATLAB\MATLAB Compiler Runtime\v717\runtime\win32; F:\Program Files\MATLAB\R2012a\runtime\win32;F:\ProgramFiles\MATLAB\R2012a\bin; 这是2个程序,需要都配置环境变量. b M

java调用matlab函数

如何将实验结果在matlab中可视化呢,下面使用java语言编程,调用matlab中的函数: 本人安装的是Matlab7.11.0 (R2010a)和 Eclipse 4.2 : 1)首先设置环境变量,运行tomcat,Eclipse等都需要依靠环境变量JAVA_HOME,Path,classpath,具体的设置可以参考这里 为了使在matlab中将.m函数编译为jar包,还需要在classpath中添加: %matlabInstallRoot%\R2010a\toolbox\javabuild

用C#调用Matlab图像处理自制QQ游戏2D桌球瞄准器

平时不怎么玩游戏,有时消遣就玩玩QQ里的2D桌球,但是玩的次数少,不能像骨灰级玩家一样百发百中,肿么办呢?于是某天突发奇想,决定自己也来做个“外挂”.说是外挂,其实只是一个瞄准器,毕竟外挂是修改别人的软件,有点违法的意思,况且自己还没有能力去那么做,所以自己还是弄个瞄准器,做做弊,过下小瘾,同时也提高一下自己的编程能力. 起初(也就是半年前),自己尝试做一个瞄准器的初始版本,用C#做,想法很简单: Step1.把鼠标移到洞口,获取鼠标位置: Step2.将鼠标放到要击打的球的圆心上,获取鼠标当前

[Python-MATLAB] 在Python中调用MATLAB的API

可以参考官方的说明文档: http://cn.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-for-python.html MATLAB Engine API的使用文档: http://cn.mathworks.com/help/matlab/matlab-engine-for-python.html 原材料: 1.MATLAB 2015a  32位的 2.Python 2.7.13    32位