问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VC 如何调用 matlab的m文件

发布网友 发布时间:2023-01-14 06:39

我来回答

2个回答

热心网友 时间:2023-11-07 15:51

Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数。但在很多情况下,我们不得不使用VC编程。那么,如何在VC中利用matlab的资源呢? 在这里我简要的以一个简单的例子来说明一下如果在VC中调用matlab中定义的.m文件。繁多的理论就不说了,简明扼要的说一个实例。相信大家看过之后都会马上学会的J
其中灰色底显示的部分是需要我们手工输入的部分。
步骤如下:
一当然是先建立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
四这一步比较关键。在这一步中,将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 moles中加入:
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)

热心网友 时间:2023-11-07 15:52

如果在运行VC++6.0程序的机器上有matlab安装,则有两种方法:
=====================================================
方法一:
matlab为vc6提供了库函数engineOpen来调用其计算引擎。
======================================================

vc调用matlab引擎的一个简单例子

我按如下步骤在vc中使用matlab引擎:
(1)。启动vc6。0,建立一个mfc(exe)类型工程matlabengine。
(2)。在项目建立后,设置环境。
Tool->options->Diretories 页面下Show directories for
先选择Include Files,输入路径:D:\PROGRAMS\MATLAB6P5P1\EXTERN\INCLUDE
在选择Library Files,输入路径:D:\PROGRAMS\MATLAB6P5P1\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
(我的matlab根目录是 D:\PROGRAMS\MATLAB6P5P1\ ;这里的设置对不同工程只需要一次)
(3)。打开Project->Settings->Link页面,在Object/Library moles
中加入libmatlb.lib libeng.lib libmx.lib。(这里对每个工程都要设置,并且根据需要选不同的库)
(4) 在工程目录的view的头文件中加入
##include "engine.h"

(5) 在about 对话框加入一个按钮,在其按钮响应函数如下:
void CAboutDlg::OnButton1()
{
Engine *ep;
double t[1];

t[0]=6.28;
mxArray *T=NULL;

if(!(ep=engOpen(NULL)))
{
AfxMessageBox("Can not open the matlab engine!");
exit(-1);
}

T=mxCreateDoubleMatrix(1,1,mxREAL);
memcpy((char*)mxGetPr(T),(char*)t,1*sizeof(double));

engPutVariable(ep,"T",T);

engEvalString(ep,"T1=0:pi/48:T;");
engEvalString(ep,"D=sin(T1)");
engEvalString(ep,"plot(T1,D,'r-');");

engEvalString(ep,"xlabel('t‘);");
engEvalString(ep,"ylabel('sin(t)');");
engEvalString(ep,"title('sin(x)的图像');");

mxDestroyArray(T);

}

=============================================
方法二:以ActiveX Automation的方式调用matlab

=============================================

如果要脱离matlab运行,就需要
1 将m文件编译成普通dll,或编译成COM
2 在目标机器上安装MCRInstaller.exe.
3 从VC中调用dll或COM
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? VC调用MATLAB vc++调用matlab的问题 VC++如何调用matlab工具箱函数? vc调用matlab带参数的函数 VC怎样才能调用MATLAB的函数 水养发财树如何养护 牵丝戏的歌词是什么 橘子皮煮水和金桔煮水的区别 基本的销售话术技巧有哪些 腋臭手术伤口多久会好 做腋臭手术后需要休息多久 做狐臭手术多久能恢复 翡翠怎么在家量圈口 翡翠手镯圈口怎么量 翡翠手镯圈口怎样测量 翡翠手镯的尺寸测量方法翡翠带多大的怎么量 教你怎么正确测量翡翠手镯圈口 梦见豇豆花椒糯米 梦见吃酸菜和肉 梦见吃酸东西 联通手机号更改为电信,但是忘记解绑QQ了,一直用它登陆爱奇艺和其他APP,帐号申诉过不去怎么办 明星电子刊购买成功之后阅读码不显示怎么办 被盗了,微信钱包里面的钱怎样才能找回? 被盗支付密码也知道,银行卡绑定了,但卡里有钱,怎么办,银行卡里的钱还在吗? 枣树上为何会蛰人? 《霸王别姬》之虞姬的真假霸王 毕业生党员转组织关系,介绍信已经到了接收方,并已经给了回执联,却发现转出方还没有在系统上发起转出 。关于党员。我一朋友09年大学毕业。在大学里她成了党员。大学毕业时学校开了个党组织关系介绍信回执联 打开钉钉分享的回放视频权限不够 未婚打胎后要注意什么 京东上价格高低排序是什么意思 信用卡一不小心逾期了一次 金条逾期多少算金额大 新买的微距镜头景深很浅怎么破··· 奇!为什么DC微距景深效果特别好? qq邮箱前段时间还可以关闭,现在怎么无法关闭了,只能举报和设置黑名单,请高手指点下------- 面试时,面试官问你是什么学校毕业的,你回答:“吉林大学”,他会有什么反应? 白岩松都在哪些做过大学演讲?比如中山大学,耶鲁大学等。 急急急!画心形怎么画? 怎样把输入法图标放在桌面上?