C++调用matlab案例

合集下载

c语言实现matlab std函数

c语言实现matlab std函数

c语言实现matlab std函数摘要:1.引言2.C 语言与MATLAB 的概述3.MATLAB std 函数的实现方法4.实例:使用C 语言实现MATLAB std 函数5.总结正文:【引言】在科学技术的发展中,编程语言发挥着越来越重要的作用。

C 语言和MATLAB 作为两种广泛应用的编程语言,分别在底层硬件控制和科学计算领域有着举足轻重的地位。

有时,我们需要将两者结合使用,实现一些特定的功能。

本文将介绍如何使用C 语言实现MATLAB std 函数。

【C 语言与MATLAB 的概述】C 语言是一种通用的编程语言,具有高性能和灵活性。

它被广泛应用于操作系统、嵌入式系统、硬件驱动等领域。

MATLAB(Matrix Laboratory)是一款商业数学软件,主要用于数据分析、可视化和算法开发。

它拥有丰富的函数库和强大的矩阵计算能力,在工程和科研领域具有广泛的应用。

【MATLAB std 函数的实现方法】要实现MATLAB std 函数,首先需要了解MATLAB 的函数调用机制。

MATLAB 中的函数分为两类:内置函数和自定义函数。

内置函数由MATLAB直接提供,而自定义函数则需要用户自己编写。

MATLAB 通过函数句柄(function handle)来调用自定义函数。

函数句柄是一个指向函数入口的指针,可以通过函数名获取。

实现MATLAB std 函数的步骤如下:1.编写C 语言代码,实现所需的功能。

2.使用MATLAB 的C 语言接口(MATLAB Compiler)将C 语言代码编译成MATLAB 可调用的函数。

3.在MATLAB 中使用函数句柄调用编译后的C 语言函数。

【实例:使用C 语言实现MATLAB std 函数】为了演示如何实现MATLAB std 函数,我们以一个简单的例子为例。

假设我们要实现一个名为“my_function”的函数,该函数接受一个整数参数n,并计算n 的阶乘。

在MATLAB 中,我们可以这样调用该函数:```matlabresult = my_function(5);```首先,我们需要编写C 语言代码实现该功能:```c#include "matlab_std.h"// MATLAB 函数入口void my_function(int n) {// 计算n 的阶乘int result = 1;for (int i = 1; i <= n; i++) {result *= i;}// 返回结果MATLAB_return_double(&result);}```接下来,我们需要使用MATLAB Compiler 将C 语言代码编译成MATLAB 可调用的函数。

Matlab调用MFC应用实例

Matlab调用MFC应用实例

//MainFunction.cpp#include "stdafx.h"#include "mex.h"#include "MFCDialog.h"voidmexFunction(intnlhs, mxArray *plhs[], intnrhs, constmxArray *prhs[]) {mxArray *pa=NULL;double *x=NULL;double *y=NULL;double *result=NULL;charstrbuf[50];if(nrhs!=2){mexErrMsgTxt("You can only input 2 arguements!");return;}else{x=mxGetPr(prhs[0]);y=mxGetPr(prhs[1]);sprintf(strbuf,"x=%f,y=%f",*x,*y);mexPrintf(strbuf);plhs[0]=mxCreateDoubleMatrix(1,2,mxREAL);result=mxGetPr(plhs[0]);result[0]=*x;result[1]=*y;mexPrintf("\nStart MFC\n");MFCDialog *a;a=new MFCDialog();if(a->DoModal()==IDCANCEL){mexPrintf("Exit MFC\n");}mexPrintf("End MFC\n");}}// MFCDialog.cpp : implementation file//#include "stdafx.h"#include "MFCPlot.h"#include "MFCDialog.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// MFCDialog dialogMFCDialog::MFCDialog(CWnd* pParent /*=NULL*/): CDialog(MFCDialog::IDD, pParent){//{{AFX_DATA_INIT(MFCDialog)// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT}voidMFCDialog::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(MFCDialog)// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(MFCDialog, CDialog)//{{AFX_MSG_MAP(MFCDialog)// NOTE: the ClassWizard will add message map macros here //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// MFCDialog message handlers// MFCPlot.cpp : Defines the initialization routines for the DLL.//#include "stdafx.h"#include "MFCPlot.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//// Note!//// If this DLL is dynamically linked against the MFC// DLLs, any functions exported from this DLL which// call into MFC must have the AFX_MANAGE_STATE macro // added at the very beginning of the function.//// For example://// extern "C" BOOL PASCAL EXPORT ExportedFunction()// {// AFX_MANAGE_STATE(AfxGetStaticModuleState()); // // normal function body here// }//// It is very important that this macro appear in each// function, prior to any calls into MFC. This means that// it must appear as the first statement within the// function, even before any object variable declarations// as their constructors may generate calls into the MFC// DLL.//// Please see MFC Technical Notes 33 and 58 for additional // details./////////////////////////////////////////////////////////////////////////////// // CMFCPlotAppBEGIN_MESSAGE_MAP(CMFCPlotApp, CWinApp)//{{AFX_MSG_MAP(CMFCPlotApp)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMFCPlotApp constructionCMFCPlotApp::CMFCPlotApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CMFCPlotApp objectCMFCPlotApptheApp;; MFCPlot.def : Declares the module parameters for the DLL.LIBRARY "MFCPlot"DESCRIPTION 'MFCPlot Windows Dynamic Link Library'EXPORTS; Explicit exports can go heremexFunction// stdafx.cpp : source file that includes just the standard includes// MFCPlot.pch will be the pre-compiled header// stdafx.obj will contain the pre-compiled type information#include "stdafx.h"#if !defined(AFX_MFCDIALOG_H__543ADFB6_3136_4D44_B9E6_075E1F9DFD03__INCLUDED _)#define AFX_MFCDIALOG_H__543ADFB6_3136_4D44_B9E6_075E1F9DFD03__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// MFCDialog.h : header file//#include "resource.h"/////////////////////////////////////////////////////////////////////////////// MFCDialog dialogclassMFCDialog : public CDialog{// Constructionpublic:MFCDialog(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(MFCDialog)enum { IDD = IDD_DIALOG };// NOTE: the ClassWizard will add data members here //}}AFX_DATA// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(MFCDialog)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:// Generated message map functions//{{AFX_MSG(MFCDialog)// NOTE: the ClassWizard will add member functions here//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_MFCDIALOG_H__543ADFB6_3136_4D44_B9E6_075E1F9DFD03__INCLUDED_)// MFCPlot.h : main header file for the MFCPLOT DLL//#if !defined(AFX_MFCPLOT_H__6A1F0D27_6E86_47D8_BA48_0E195799BD15__INCLUDED_) #define AFX_MFCPLOT_H__6A1F0D27_6E86_47D8_BA48_0E195799BD15__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#ifndef __AFXWIN_H__#error include 'stdafx.h' before including this file for PCH#endif#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////// CMFCPlotApp// See MFCPlot.cpp for the implementation of this class//classCMFCPlotApp : public CWinApp{public:CMFCPlotApp();// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMFCPlotApp)//}}AFX_VIRTUAL//{{AFX_MSG(CMFCPlotApp)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_MFCPLOT_H__6A1F0D27_6E86_47D8_BA48_0E195799BD15__INCLUDED_)//{{NO_DEPENDENCIES}}// Microsoft Developer Studio generated include file.// Used by MFCPlot.rc//#define IDD_DIALOG 3000// Next default values for new objects//#ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_VALUE 3001#define _APS_NEXT_COMMAND_VALUE 32771#define _APS_NEXT_CONTROL_VALUE 3000#define _APS_NEXT_SYMED_VALUE 3000#endif#endif// stdafx.h : include file for standard system include files,// or project specific include files that are used frequently, but// are changed infrequently//#if !defined(AFX_STDAFX_H__ED1F4467_E80C_41BC_8353_8D4B463DC0AE__INCLUDED_) #define AFX_STDAFX_H__ED1F4467_E80C_41BC_8353_8D4B463DC0AE__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers#include <afxwin.h> // MFC core and standard components#include <afxext.h> // MFC extensions#ifndef _AFX_NO_OLE_SUPPORT#include <afxole.h> // MFC OLE classes#include <afxodlgs.h> // MFC OLE dialog classes#include <afxdisp.h> // MFC Automation classes#endif // _AFX_NO_OLE_SUPPORT#ifndef _AFX_NO_DB_SUPPORT#include <afxdb.h> // MFC ODBC database classes#endif // _AFX_NO_DB_SUPPORT#ifndef _AFX_NO_DAO_SUPPORT#include <afxdao.h> // MFC DAO database classes#endif // _AFX_NO_DAO_SUPPORT#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls#ifndef _AFX_NO_AFXCMN_SUPPORT#include <afxcmn.h> // MFC support for Windows Common Controls#endif // _AFX_NO_AFXCMN_SUPPORT//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_STDAFX_H__ED1F4467_E80C_41BC_8353_8D4B463DC0AE__INCLUDED_)。

VC与Matlab混合编程

VC与Matlab混合编程

VC与Matlab混合编程本⽂主要介绍VC与Matlab混合编程的两种⽅法,并详细介绍了VC向Matlab传递复杂数据:结构体的⽅法,有详细代码说明。

Matlab 主要⾯对科学计算、可视化以及交互式程序设计的⾼科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运⾏环境,因⽽在处理⼀些实际应⽤问题时显得灵活性不⾜,⽽VC++则在⼀定程度上能够弥补这⼀漏洞,因此,将⼆者结合共⽤,各献其长,可以为科研⼯作和⼯程开发提供更为强⼤的技术⽀持。

Matlab作为控制系统设计的⼀种通⽤⼯具,它可以很⽅便的和VC进⾏连接。

⼀般⽽⾔,Matlab与VC混合编程的实现⽅法有很多种,这⾥主要介绍以下两种:1. VC调⽤Matlab Engine的⽅式:Matlab Engine是⼀组Matlab提供的接⼝函数,⽀持C/C++语⾔,Matlab Engine采⽤C/S(客户机/服务器)模式,Matlab作为后台服务器,⽽C/C++程序作为前台客户机,向Matlab Engine传递执⾏命令和数据信息,从Matlab Engine接收执⾏结果。

⽤户可以在前台应⽤程序中调⽤这些接⼝函数,实现对Matlab Engine的控制。

采⽤这种⽅法⼏乎能利⽤Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执⾏效率较低。

下⾯简单介绍下这种⽅式的实现步骤:1.1 API接⼝介绍先来介绍⼀组Matlab提供的引擎API接⼝:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)Engine* engOpen(const char* startcmd)启动Matlab引擎int engClose(Engine* ep) 关闭Matlab引擎int engEvalString(Engine* ep, const char* string)执⾏Matlab表达式mxArray* engGetArray(Engine* ep, const char* name)获取⼀个变量数组的值int engPutArray(engine* ep, const mxArray* mp)设置⼀个变量数组的值int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上mxArray *engGetVariable(Engine *ep, const char *name)获取⼀个变量int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串1.2 VC环境配置要想在VC集成环境下调⽤Matlab引擎实现VC和Matlab的混合编程,⼀般需要经过以下⼏个必要的步骤:(以下以Matlab2008a和VS2005版本为例)(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下(2)添加lib路径:将“\extern \lib\win32\microsoft” (在Matlab的安装路径下) 路径添加到VC编译器的lib下(3)加载lib:需要加载⾄少libmx.lib、libmat.lib、libeng.lib三个库(4)include头⽂件:在要使⽤ engine 函数的地⽅包含engine.h头⽂件1.3 引擎调⽤接下来就可以在VC中调⽤Matlab引擎了,简单的⽰例代码如下:#include "engine.h"#pragma comment(lib, "libeng.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")void TestDeno(){Engine* pEng = NULL;if (!(pEng = engOpen(NULL))){printf("Open matlab enging fail!");return;}//call Engine plot A*sin(t)+B A=2 B=1mxArray *A = NULL;double init = 2;A = mxCreateDoubleMatrix(1, 1, mxREAL);memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "A", A);init = 1;memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "B", A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");if(NULL != pEng){engClose(pEng);}}⽰例代码通过VC调⽤Matlab引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:2. VC调⽤Matlab DLL的⽅式DLL是⼀个可执⾏的⼆进制⽂件。

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。

本文就对如何在C程序中调用Matlab程序作说明。

在C程序中调用Matlab程序有两大类方法。

第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。

前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。

关于MCR,请见第四章的说明。

至于两种方法需要在C环境中如何配置请见第五章。

而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。

一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。

下面是调用Matlab中的加法程序add.m的例子。

先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。

C++调用matlab动态库

C++调用matlab动态库

C++调用matlab动态库环境:Windows 7旗舰版(32位),VS2008,Matlab R2010b1. matlab中dll创建1.1 m文件编写function t = func(file)t=2;end将M文件保存为func.m,保存在d:/test文件夹中。

1.2 设置编译器在Matlab主窗口中将当前文件夹改为d:/test。

为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:mex -setup然后出现Please choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n?键入y后回车,出现Select a compiler:[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\Matlab\sys\lcc[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0[0] NoneCompiler:由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现Please verify your choices:Compiler: Microsoft Visual C++ 2008 SP1Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n?键入y后回车,出现*************************************************************** ************Warning: MEX-files generated using Microsoft Visual C++ 2008 requirethat Microsoft Visual Studio 2008 run-time libraries beavailable on the computer they are run on.If you plan to redistribute your MEX-files to other MATLAB users, be sure that they have the run-time libraries.*************************************************************** ************Trying to update options file: C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB \R2010b\mexopts.bat From template:D:\PROGRA~1\Matlab\bin\win32\mexopts\msvc90opts.bat Done . . .*************************************************************** ***********Warning: The MATLAB C and Fortran API has changed to support MATLABvariables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at:/doc/35346238.html,/support/solutio ns/en/data/1-5C27B9/?solution=1-5C27B9 Building with the -largeArrayDims option enables the new API.*************************************************************** ***********如果出现以上说明,则证明Matlab编译器设置成功了。

使用VC调用matlab_engine编程

使用VC调用matlab_engine编程

关于如何使用VC调用matlab engine编程刚开始学使用VC调用matlab engine编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在matlab6.5和vc++6.0环境下完成的,但是现在我用的是matlab2010a,所以会出现很多环境配置的问题,写本文的目的是总结用我在用VC调用matlab engine编程过程中出现的问题和解决办法。

Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。

调用使用的函数是:engEvalSting。

下面是自己的实践过程:如果是第一次使用,则要设置一下Visual C++6.0 编程环境中的include 和lib的路径指向。

我的matlab2010安装在D盘目录D:\MATLAB 2010一、设置VC相关属性。

(1)Visual C++6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for 下拉列表中选择Include Files,添加路径:D:\MATLAB 2010\extern\include (这是我电脑中Matlab的安装路径);再选择下拉列表中的 Library Files,添加路径:D:\MATLAB 2010\extern\lib\win32\microsoft(我电脑中Matlab 的安装路径,但是在我查看资料的时候看到很多是D:\MATLAB2010\extern\lib\win32\microsoft\msvc60这个路径,但是我用的是MatlabR2010a,msvc60是matlab6.5老版本才有的,10.0版本没有这个文件,所以我们把路径设到D:\MATLAB 2010\extern\lib\win32\microsoft 就可以了)。

在C++中调用Matlab

在C++中调用Matlab
5)将Matlab中的运行结果回传给C、C++
二、程序实现
我们通过一个简单的程序demo.c来说明C、C++对Matlab的调用。
#include
#include
#include
#include
/*在头文件中加入engine.h。其包含了调用的Matlab函数声明。*/
#include "engine.h"
在c,c++中调用Matlab
在பைடு நூலகம்,c++中调用Matlab
在C、C++中调用Matlab
Matlab是美国MathWorks公司的产品,是一种以矩阵为基本编程单位的高效数值计算语言。Matlab集科学计算、图像处理、声音处理于一体,为用户提供了丰富的Windows图形界面设计方法,使用户能够在利用其强大数值计算功能的同时设计出友好的图形界面
engClose(ep);
mxDestroyArray(a_ptr);
return(0);
}
当然,该程序在编译之前还需设置一些环境参数。在不同的开发环境中,其设置方法略有差异,我们以Borland C++ builder开发平台为例加以说明。
1)首先必须完成Matlab中链接库的导入工作。在Matlab\extern\include中存在_libmx.def、_libmat.def、_libeng.def等定义文件,在DOS环境中对它们执行命令:
另一种方式是选择将一个自定义的数据结构复制到mxArray中,值得注意的是Matlab在存储矩阵时是按列序保存的,而在C、C++中是按行序保存的,所以转换时注意分清下标。
3)调用engPutArray函数将矩阵放入到Matlab工作区中。

Matlab CC++函数库介绍及应用举例

Matlab CC++函数库介绍及应用举例

经过实践证明,可以在很大程度上提高软件开发效率,增加算法的稳定程度。

目前已有一些利用混合编程开发的软件系统:如雷达特性分析、实时预测软件等,在实际中已得到了应用。

一、引言1984年美国的Mathworks公司推出Matlab,到目前为止,它已发展成为国际上最优秀的科技应用软件之一。

其强大的科学计算与可视化功能,简单易用的开放式可扩展环境以及多达30多个面向不同领域而扩展的工具箱(Toolbox)支持,使得Matlab在许多学科领域中成为计算机辅助设计与分析、算法研究和应用开发的基本工具和首选平台。

但是由于其编译器采用伪编译的方式,在Matlab中编写的程序无法脱离其工作环境而独立运行。

针对这个问题,Mathworks公司为Matlab提供了应用程序接口,允许Matlab和其它应用程序进行数据交换,并且提供了C/C++数学和图形函数库,为在其它程序设计语言调用Matlab高效算法提供了可能。

C++语言是新一代的以面向对象(OOP)概念为根本的高级程序设计语言,它的面向对象的概念更加符合程序员开发软件的思维习惯,类封装性和模块化的构造非常适合软件的移植和维护,使用C++开发有助于提高软件工程的质量。

VC++是美国微软公司利用C++的底层机理开发的新一代编译器,与其它一些C++编译器相同,都是以C++语言为编译对象。

VC++在编译速度和代码优化方面,是同类产品的佼佼者,并且绝大多数的软件开发包都提供了对它的接口,这是VC++得到程序员认可的主要原因。

对于理工科研究生和一些偏重于数值计算的工程技术人员,为了能够较好的在短期之内完成一个兼具友善界面和稳定的计算内核的程序,利用软件接口技术,可以借助于第三方的函数库。

二、Matlab应用程序接口MATLAB提供的应用程序接口按目的一般来说可以分为以下三种:1.利用其它应用程序的优点,例如计算速度快和使用已有算法而制定的接口;2.建立MATLAB与其它应用程序间的数据交换;3.拓广MATLAB的应用范围和应用手段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++中调用matlab
(2011-4-20下载)
步骤如下:
㈠当然是先建立matlab的m文件。

这里为了简单起见,我在matlab中定义了一个函数,其m文件如下:
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
㈣这一步比较关键。

在这一步中,将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
㈤新建一个VC工程。

这里取名为mat。

为了简单,我们在这里建立一个对话框来进行演示。

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

㈥进行VC编程。

首先,在cpp文件中加入: #include “ppp.h”
然后,设置VC的链接库。

在project-settings-link下的object/library modules中加入:
ppp.lib libmx.lib libmatlb.lib libmmfile.lib
至此,VC的编译环境设置完毕。

下面就是编程部分了。

㈦编程部分的关键:接口和数据类型的转换
先给出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的相加运算,结果如下:
(全文完)。

相关文档
最新文档