导航:首页 > 编程语言 > matlab和vc混合编程

matlab和vc混合编程

发布时间:2023-01-26 23:13:49

A. vc++ matlab混合编程 fsolve

这个可以有四种方法实现:
(1)将Matlab程序编译成 C/C++源文件并嵌入VC++;
(2)在C/C++程序中利用 Matlab engine调用 Matlab函数;
(3)在C/C++程序中直接使用 Matlab C/C++ Math Library;
(4)将.m文件编译成 *.dll文件嵌入到 VC++的程序中。
自己上网查一下。

不过告诉你一个简单的,在matlab的工作窗口执行:
mbuild -setup

按提示操作
然后执行
met -setup
完成后,到VC里面,应该会出现met工程选项,然后操作就很简单了。

B. matlab VC混合编程调用神经网络工具箱

调用MATLAB Engine虽然可以实现对神经网络工具箱的功能,但是因为这种方法是基于C/S模式的,效率很低,而且需要在matlab下实现其功能,无法脱离matlab直接运行,所以,基于这个原因,我放弃了利用MATLAB Engine来实现混合编程。利用C++数学库虽然可以脱离MATLAB直接运行,但是C++数学库并不支持神经网络工具箱,所以,无法实现基于神经网络的混合编程。利用mcc命令虽然可以直接生成.exe文件,并可以脱离MATLAB在VC++中直接运行,但是因为其自身的诸多缺点,这种方法并不能编译神经网络函数为C++文件,所以,也无法胜任这个任务。 最后,只有COM组件这一个办法了,由于COM组件技术的强大功能,利用matlab的COM Builder工具可以实现脱离matlab的混合编程,并成功的调用了神经网络工具箱。

C. 请问大神,在VC++和matlab混合编程中,结构体如何转换成mwArray形式的

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=1

mxArray *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是一个可执行的二进制文件。把很多通用的功能放在DLL中,可以供各种应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享。Matlab也支持将m程序编译成dll,供其他语言(包括VC、VB、Fortran等)调用,下面先简单介绍下Matlab DLL的编译步骤:
2.1 Matlab DLL制作
(1)配置Matlab的编译器跟,要将mex和mbuil两个都配置成本机上安装的VC,mbuild的配置方法同mex
(2)编译m函数成为dll,在matlab命令空间中使用mcc命令编译m文件:(mcc的使用参考Matlab帮助)
示例:将一个Matlab函数MyFun 编译成libMyFun 的命令:
mcc –W cpplib:libMyFun –T link:lib MyFun
参数说明:-W控制编译之后的封装格式,cpplib表示c++的lib,冒号之后是编译输出lib名,-T表示目标,link:lib表示连接到lib的目标,MyFun是待编译的m文件名,编译成功之后,会输出三个文件:libMyFun.lib libMyFun.dll libMyFun.h

2.2 DLL在VC中调用
要想在VC集成环境下调用Matlab的DLL,实现VC和Matlab的混合编程,一般需要经过以下几个必要的步骤:(以下以Matlab2008a和VS2005版本为例)
(1)VC环境配置,同前面VC调用Matlab引擎方式类似,也需要配置VC的编译环境,其中include路径、lib路径和前一种方式相同,加载的lib变更为:mclmcrrt.lib、libmx.lib、libmat.lib、mclmcr.lib四个,include的头文件变更为:mclmcr.h、matrix.h、mclcppclass.h三个。
(2)DLL中函数的调用,先看一下m函数编译成C++Dll之后的函数声明,例:matlab函数:function [y, out] = CaculateFun(x, in)编译之后对应c++的声明:void MW_CALL_CONVCaculateFun(int nargout, mwArray& y, mwArray& out, const mwArray& x, const mwArray& in)参数int nargout指定调用时,输出参数的个数,紧跟的后续nargout个参数y、out为输出参数,后续再剩下的多个参数x、in就为输入参数。
(3)注意事项:在VC中调用dll中的函数之前,需要先调用函数libFunInitialize初始化,在调用完函数以后,需要再调用函数libFunTerminate和mclTerminateApplication终止。
准备好了上述步骤,就可以在VC中调用DLL中函数的了,简单的示例代码如下:

// include matlab sys head file
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"

// include lib head file
#include "libCaculateFun.h"

// link matlab sys lib
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "mclmcr.lib")

// link lib
#pragma comment(lib, "libCaculateFun.lib")

void TestDeno()
{
// init lib
if (!(libCaculateFunInitialize()))
{
std::cout<<"Could not init lib !"<<endl;
return -1;
}

double xxxx[2] = {0};
double inin = 0;

double yyyy[2] = {0};
double outo = 0;

// 为函数参数分配内存空间
mwArray mwXX(1, 2, mxDOUBLE_CLASS);
mwArray mwIn(1, 1, mxDOUBLE_CLASS);

mwArray mwYY(1, 2, mxDOUBLE_CLASS);
mwArray mwOut(1, 2, mxDOUBLE_CLASS);

// 为输入参数赋值
mwXX.SetData(&xxxx, 2);
mwIn.SetData(&inin, 1);

// 调用计算函数
CaculateFun(2, mwYY, mwOut, mwXX, mwIn);

// 获取输出参数
outo = mwOut.Get(1, 1);

// lib Terminate
libCaculateFunTerminate();

// MCR Terminate
mclTerminateApplication();
}

D. Matlab 与 VC 混合编程

该书已经出到第二版,即使从这个角度讲,也能看出作者对编写该书的认真程度。该书第一版在2005年出版,是国内较早介绍matlab与C++混合编程的书籍之一。
如果您要购买,请购买第二版,因为不同版本所依托的matlab的版本也是不同的。

E. vc matlab 混合编程,哪种方式最好

调用matlab引擎:是要求MATLAB作为VC的一个后台来调用,从本质来说还是在MATLAB中运行的程序;
基于matcom:可以脱离MATLAB的环境,但是貌似有一部分MATLBA中的函数不能完全调用;而且方法简单;
基于COM的:这个我不太会也没有试过;
我推荐将MATLAB的程序编译成动态库在VC中调用,这也可以完全脱离MATLAB的环境,可以完美调用

阅读全文

与matlab和vc混合编程相关的资料

热点内容
linux命令app 浏览:791
土方标高计算法 浏览:592
家教高级教程女演员叫什么 浏览:360
日本日本翻译汉语电影 浏览:491
言情动漫免费 浏览:40
安卓手机图像变黑白色了怎么办 浏览:279
linux查看用户和密码 浏览:976
穿书荒岛:女主把我奶上天小说 浏览:156
主角能看见别人气运的小说 浏览:577
求一个不用下载播放器的网址 浏览:686
免费在线国产小电影 浏览:544
尺度大的女同电影 浏览:371
纯爱高干生子的小说 浏览:879
linux开发服务端 浏览:962
不要VIP的电视网站 浏览:780
看欧美出轨的.看欧美出轨的女人 浏览:872
linuxsignal函数 浏览:248
你的名字 国语 下载 浏览:280
银河麒麟下编译qt源码 浏览:163
读单片机的flash 浏览:839