Matlab与VC混合编程小问题解答
Matlab引擎实现VC和Matlab混合编程

Matlab引擎实现VC和Matlab混合编程
要想在VC集成环境下利用Matlab引擎实现VC和Matlab的混合编程,一般需要经过以下几个必要的步骤:
(1)Visual C++6.0 编译环境的设置:通过菜单Tools/ Options,打开Visual C++6.0设置属性页,进入Directorie页面,在Show Directories for下拉列表中选择Include Files,添加路径:D:\Matlab6p5\extern\include(在Matlab的安装路径下);再选择下拉列表中的Library Files,添加路径:D:\Matlab6p5\extern\ lib\win32\Microsoft\msvc60(在Matlab的安装路径下)。
编译环境只需设置一次。
(2)添加库文件: 通过菜单Projects|settings,进入Link 页面,在Object/Library Modules 框中,添加库文件名:libmx.lib 、libmat.lib 、libeng.lib。
每个新的工程文件都要单独添加库文件。
(3)在使用engine 函数的程序头文件中包含如下两个头文件:#include "engine.h";#include 。
(4)在应用程序中添加调用Matlab引擎的程序代码:
以上步骤是对VC与Matlab混合编程的编译环境进行设置,在完成了以上基本步骤后就可以利用Matlab引擎库函数engEvalString来调用Matlab的内建函数了。
VC++与Matlab混合编程常见问题

VC++与Matlab混合编程常见问题******************************VC++与Matlab混合编程常见问题命令行如何运行simulink外部模式build和start用sim()函数该函数的调用格式为:[t,x,y]=sim(f1,tspan,options,ut)其中f1为SIMULINK的模型名,tspan为仿真时间控制变量;参数options为模型控制参数;ut为外部输入向量请问matlab中的仿真模块,可以看到起源程序吗?那些基本模块是看不了源代码的,有很多模块是用subsystem组成的,你可以用look under mask(鼠标右键)看到里面是怎样用子模块搭接的,还有很多是由s函数写成的simulink的模块,这些直接edit sfunname(s函数的名字)就可以看到源代码请问:在simulink参数中设置的步长是50e-6,在系统中有一个simout模块向MATLAB中传递数据,但是希望以1e-3的步长获取数据,因该如何设计?在simout模块中直接设定仿真步长是不能运行的需要插入一个"zero order hold"模块,将该模块的采样时间设置为1e-03就可以了simulink中IGBT等电力元件都有个m极,是什么作用的?用于测量流过IGBT电流及其电压用simlink画的图,在示波器中显示,如何复制到word中告诉你一个办法,在加上示波器的地方加上to workspace改为array在主窗口中plot直接抓过去也行吧Edit下有copy model选项simulink中的mask问题请问如何封装prompt,varible填啥如何初始化prompt中,填写变量的提示,如:直线斜率variable中填写变量名.如:k有关神经网络工具箱为什么当训练和仿真时,命令窗口会出现一堆warning?如:*WARNING* TRAINBPX is an obsolete function.Use NNT2FF and TRAIN to 更新 and train your network.无效 NNTWARN OFF to suppress NNT warning messages.trainbpx,simuff这些命令应该怎么用?你用的神经网络不太适合你的matlab版本,有点过时了,对于BP网络,像用newff训练就没问题,建议你可买一本较新的神经网络参考书还可看matlab 的help一个关于simulink仿真的问题根据4个输出a1a2a3a4判断,输出最大的ai所对应的数这样一个过程不用s函数能不能实现阿?我用了if else语句,但是无法把不同时刻的不同输出值汇总成串行数据流输出用mux将各路信号构造成向量信号,再用matlab fcn下的max 对之进行操作即可怎么实现在simulink仿真过程中与其他程序进行通讯,即如何在simulink仿真过程中实时读出数据不论通过网络或变量空间中的变量都行,应该怎么实现,请教!用to workspace或to file 都可以保存仿真时的数据请问如何在simulink中实现A/D和D/A转换有相关的模块,在xpc中,不过得和硬件对应上请问如何改变ode45函数中的步长ode45现在的版本不允许显式给出步长请教:如何将workspace中的输入,输出数据存为*.txt文件?save filename varname -ASCIIvarname是要存储的变量名,之间用空格分隔将PID的SIMULINK图的输出仿真图形怎样与自己设计的界面中的按钮连接回调函数怎么编要显示的数据用Outport端子表示,就可以用sim函数直接获得数据了怎样才能增加采样点?在Simulink里边连接框图,阶跃step输入经过一积分环节1/s,用out输出至workspace,tout跟yout都为56×1,能不能把56变成更大的值?怎么设置?谢谢能增加,simulink中你得到的是默认的结果如果向增加,则可以认为减小允许的误差限,即在simulink中的relative error项,如将其变化成e-6或其他更小的值另外还可以通过定步长方法进行仿真(这时应该注意要确认能保证仿真精度要求)我最近在做电机控制的仿真时,遇到一个问题我是用matlab6.5中的电机模块做为模型,然后自己搭建了一个变频器在运行中经常出现运行到一半时就进行不下去了,simulink报错说步长有问题,我修改后还是不行请问在做有关电机的仿真时,应该如何设置仿真环境试试改变仿真算法,如ode15s运行时出现下面的提示:Derivative 无效 1 of block 'try1/check/Analog Filter Design' at time 0is Inf or NaN. Stopping simulation. There may be a singularity in thesolution. If not, try reducing the step size (either by reducing thefixed step size or by tightening the error tolerances)仿真系统数值不稳定,是模型的问题或是其他问题相位Phase的单位deg是什么意思?degree,it is same to say 度workspace,数据多了就存不下啦?采样时间设为0.01秒,运行若干秒以后,在workspace中打开scopedata(示波器format设定为Array,limit data points to last没选择!)时,系统提示:cannotdisplay variables with more then 10000 elements,什么原因?数据量大了是不能显示得实在不显示,可以考虑将矩阵存到文件中,你再去读文件了另外:你的矩阵维数是多少connot display variables with more than 65536 elements!a=ones(500,499);双击workspace中的a矩阵simulink中的数据为什么会丢失啊?我在做一个比较大的系统的rtw仿真可是在仿真时,要是记录数据的模块(比如示波器,to workspace)等比较多或者步长比较小时,就会出现记录的数据不全或者干脆丢失的现象,比如to workspace的数据只有后面或者前面的几百个,丢了好多记录不全出现提示信息如下Warning: Received shutdown message from target 15.002000 seconds ago.Waiting for final data logging buffer andlogging terminator...Warning: Received shutdown message from target 30.004000 seconds ago.Waiting for final data logging buffer and logging terminator... Warning: Received shutdown message from target 45.003000 seconds ago.Waiting for final data logging buffer and logging terminator... Warning: Received shutdown message from target 60.008000 seconds ago.Waiting for final data logging buffer and logging terminator... Warning: Did not received final data logging buffer and logging terminator from target. Disconnecting...这样运行就停止了,但数据不全另外,有时候运行时会出现突然黑屏现象还有就是在rtw中如何进行数据的实时观测,scope不可以了,在gui 中编程可以实现吗?看看原来的simulink模型其中示波器或其他输出环节中可能选择了存最新若干数据的选项,解除它即可请问白噪声譜生产随即数问题?已知白噪声譜为S0,如何生产随即数序列?遇到问题:1,用simulink中的Band-LimitedWhite Noise模块,设置 Noise Power为S0,可是为什么Sample time取不同的值,生成的生产随即数序列大小相差很大,有数量级的差别,不应该有那么大吧??2,生产随机数的大小与Seed的取值有关吗?3,有无更简单的方法你注意到1的现象很好实际该模块发出的噪声是经过除以sqrt(T)后的结果,T是采样周期所以你觉得幅值不同,这样可以保证噪声的强度符合有求请教:怎样能查到仿真块的程序?simulink自带的模块如果不是mask的就查不了为什么用SUMULINK里to file模块中的数据传不到M文件?需要设置什么?谢谢是写入.mat中的用load命令读入到workspace请问如何产生带限白噪声如果先产生随机数再通过滤波器,请问,滤波器归一化频率如何确定,和采样频率归一化吗使用Band-Limited White Noise模块请教:关于.m文件和simulink模型的仿真速度的问题一个控制问题,用.m文件做仿真,运行时间大约15分钟;然后作成simulink模型,运行了24小时也没有得到结果这是什么原因?simulink就如此慢吗?小弟对simulink不熟,请指教有无加快速度的办法?(accelerate用过了)谢谢问题不清楚,只能猜一下simulink是不是有代数环?在command窗口看看m文件用pcode处理一下请教:如何在.m文件中实现变量延时?就象simulink中的传输延时模块的功能谢谢没办法,m文件中只是数值计算,只有调用顺序问题,如果使用差分方程计算,对应于滞后一些的循环simulink仿真是有时间基准的Simulink模型的PreLoadFcn属性在哪里写的呀?谢谢打开模型文件file--model propertycallbacks,进行修改即可--------------------------------------------------------------------------------存在simulink下的file.mat中的文件结果怎么才能在程序里调用呢?需要什么设置filename是pend.mat,为什么用以下的语句打不开呢?load pend.matt=signals(1,;总是提示:Undefined variable.你的pend.mat文件中有该变量吗?--------------------------------------------------------------------------------为什么我在simulink里仿真得不到较好的单位阶跃图??五阶传递函数是不是你阶跃模块的第一个参数没改?是默认的1而不是0--------------------------------------------------------------------------------用MATLAB6.5版时,选用simpowersystems库中的Voltage Measurement模块,为何在每次运行时,都报Data 无效 mismatch错误,而在6.1版时则没有这个问题?估计你把非电气库的线和电气库连线混用了--------------------------------------------------------------------------------我想知道SIMULINK中的延迟模块(就是那个上面显示1/z的模块),它的延迟时间可以改变吗?比如让它作一个0.001秒的延迟参数应该怎么设?双击unit delay模块改sample time--------------------------------------------------------------------------------MATLAB里得NOTBOOK是做什么用的?MATLAB与WORD的连接,只要在命令窗口中输入:notebook -setup 按照提示就可完成设置--------------------------------------------------------------------------------离散的微分在SIMULINK中是哪块?没有,得自己搭建--------------------------------------------------------------------------------在SIMULINK里的FROMFILE模块里读入矩阵为什么总显示错误信息?我在模块上写读入文件名时信息提示该文件不是矩阵,可明明是矩阵文件呀!该矩阵文件还应该包括时间信息--------------------------------------------------------------------------------用simulink实现的线性滤波器初始条件怎么设?默认的模块不能设置,到SimulinkExtras里找--------------------------------------------------------------------------------请问如何利用simulink中的模块得到三角波(等腰)信号?用repeat sequence模块,只需定义一个周期的即可--------------------------------------------------------------------------------如何在Simulink中做到实时的响应键盘输入?我的意思是就像在VC 中那样,按下任意键后就有一个消息产生通知程序我看了帮助,waitforbuttonpress只能在GUI中使用而且不能做到实时响应Simulink支持回调函数的在simulink仿真试验中,我能不能把simulink中的数据用Toworkspace写入到matlab的工作窗口中,然后经过处理再用fromworkspace写入到simulink中可以,如果不原意写,还可以利用自动生成的tout和yout--------------------------------------------------------------------------------请问这里有人是学导航的么?有个小小问题请教我用Simulink的s-function做了一个运动轨迹数据发生模块,但是数据总有些不对后来无意中在SimulinkExtras中发现了一大堆好东东,对我最有用的是Aerospace Blocks 下面的东西,竟然连导航计算都有现成的模块!真是喜出望外啊我的问题就是:大家有谁用过这些block的吗?我猜想一定有现成的产生轨迹数据的模块,哪位大侠指点一二!!谢谢!!6.5版本带更正式的Aerospace Blockset--------------------------------------------------------------------------------powersystems blockset中的电容电阻的问题这个模块中怎么没发现电容电感电阻.三级管等东西啊,是不是不在这个模块里,要是在的话在哪,我怎么没发现啊三极管没有,需要自己搭建,电阻电容有,从RLC电路提取--------------------------------------------------------------------------------如何延长simulink的运行时间可以用Simulation/Parameters菜单设置终止时间,放慢播放可以采用定步长方法,设置小的步长--------------------------------------------------------------------------------在simulink中如何对一个连续信号进行抽样,使用什么样的模块或模块的组合信号后加保持器,如零阶保持器或Unit Delay模块--------------------------------------------------------------------------------如何在matlab仿真中使用16进制Simulink下调用MATLAB写的转换模块--------------------------------------------------------------------------------已知信号[t,v],如何在其上加高斯白噪声?要求用simulink作直接用加法器就可以--------------------------------------------------------------------------------我要产生一个随时间变化频率的正弦波,变化的频率是来自上一模块的调节输出量,而且频率是正负变化的,围绕50HZ上下波动,如:+/-0.5HZ左右.我现在产生的正弦波也可变频,但只能正变??用Fcn模块可以任意变--------------------------------------------------------------------------------simulink产生等腰三角波实时simulink的repeating sequence模块--------------------------------------------------------------------------------我是一名电力工程师,需要用matlab解决一些诸如电力网计算,化简方面的问题,请问大家在哪可以得到这方面的信息?你可以用simpowersystems模块库里面几乎包括了所有电力系统的元件我正在用它搞发电机的故障分析感觉matlab十分精深广博,要学的太多了--------------------------------------------------------------------------------如何把编好的s-function加到simulink中去将S-FUNCTION模块拖到SIMULINK下,将模块名与S-FUNCTION一致,M文件不要求编译,C文件要编译--------------------------------------------------------------------------------仿真示波器中的黑色背景能否处理?想处理示波器的背景一般是想得到图片,最好把数据存到工作空间中,用plot绘图,这样的灵活性会更大--------------------------------------------------------------------------------如何在SIMULINK中实现u=u/max(u)没法实现,因为u在仿真前没有,无从建立最大值--------------------------------------------------------------------------------如何在SIMULINK中取出状态变量?可以存入文件,然后导入.--------------------------------------------------------------------------------请问如何用simulink进行变参数系统仿真?就是说,仿真参数会随输出的值不同而发生变化,不再是个常数;而且对于输出(阶跃函数为输入)的每一点都要进行判断,如在某一范围内就计算并调整参数,如在另一范围内就重新计算并调整参数系统为多输入的比较负载的传度函数,能告诉我如何仿真吗?谢谢!用离散的仿真形式,各环节都用变量或者函数实现参数时变的线性五阶系统在MATLAB中应该怎样仿真?(用mdl 文件可以做?还是用S函数?或者离散形式做成m文件仿真?)其中参数的变化规律是已知的,哪位高人帮我解决一下这个问题,深表感谢可以自己用simulink模块搭建,不一定非得用s函数,参考一下传递函数的状态方程实现内容,可以选择一组积分器,再搭建模型---------------------------------------------------------------------------------------在matlab中,用M文件的形式编写了S-function,请问怎么把他变成自己的仿真模块,其中有什么注意事项.只需用S-function模块,打开它并在其中设置上你编写的S-function模块的函数名和参数,就可以直接使用了-------------------------------------------------------------------------本人在用simulink仿真某电机控制系统时,需要一整流桥模型无效:ua,ub ucoutput:ia,ib,ic简单的二极管模型,很难传递数据,因此本人编程M函数并通过却发现其在SIMULINK中,只能传递一组数据,只能用s函数?还是有别的高招?作为一个向量不就行了?效果不错,可是有一点不明白.首先,simulink可以认为是传递瞬时数据的一种工具,假设时间一周期有50个采样点,作为一个向量输出时,[ia,ib,ic]他们的最终数据形式应该是1X150,我不知道最终的ia,ib,ic数组会是什么样子?好像有些问题?你可以参考matlab Fcn模块的帮助,自己建一个简单的模型试一下---------------------------------------------------------------------------------------请问,在simulink里怎么设置初值用其preloadfcn属性-------------------------------------------------------------------------。
vc++6.0与matlab7.1 混编配置和注意事项

一,配置matlab7.1为了能够使用MA TLAB的Complier将*.m函数文件编译为动态链接库DLL,必须对MATLAB的环境做出相应的设置。
具体做法如下:1.。
在MATLAB的Command Window下输入命令mbuild –setup,并根据MA TLAB的提示选择合适的编译器,笔者使用的是Microsoft Visual C++6.0,进行对C++连接环境的设置。
过程如下:>> mbuild -setupPlease choose your compiler for building standalone MA TLAB applications:Would you like mbuild to locate installed compilers [y]/n? ySelect a compiler:[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2008a\sys\lcc[2] Microsoft Visual C++ 2005 in d:\Program Files\Microsoft Visual Studio 8[3] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio[0] NoneCompiler: 3Please verify your choices:Compiler: Microsoft Visual C++ 6.0Location: D:\Program Files\Microsoft Visual StudioAre these correct [y]/n? yTrying to update options file:C:\Documents and Settings\hk\Application Data\MathWorks\MATLAB\R2008a\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008a\bin\win32\mbuildopts\msvc60compp.batDone . . .2.。
VC和MATlAB混编(笔记)

基于COM的VC/MATLAB混合编程方法Matlab是一种脚本语言,程序运行效率低下,而且不能脱离Matlab软件环境,不能直接用于商用软件的开发。
VC具有代码效率高,执行速度快等优点,但是自身提供的数学函数相对较少,当遇到复杂的数值运算时,编写复杂的程序代码将大幅度延长软件开发周期。
VC++由于其丰富得人机界面,高效的执行效率已经成为基于Windows平台下开发商业软件的必备工具。
然而,VC++对于复杂的数值运算就有点“力不从心”了。
因此,混编可以充分发挥出各自的有点,开发出更加好用的软件。
VC和Matlab的混合编程有多种方法:①Matlab engine方法②直接调用Matlab的C/C++数学函数库③用Matlab自带的Matlab Compiler④使用Matcom工具(可脱离Matlab软件环境)⑤使用Matlab的combuilder工具生产COM组件(可脱离Matlab软件环境)1、基于COM的VC/MATLAB混合编程方法自Matlab6.5版本开始,新推出来的Combuilder支持把用Matlab编写的程序做成com 组件,供其他语言调用。
该方法实现简单,通用性强,成为VC与Matlab混合编程最有效的方法。
COM是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。
Matlab6.5新推出来的Combuilder就是把用Matlab 编写的程序做成com组件,供其他语言调用。
该方法实现简单,通用性强,而且几乎可以使用Matlab的任何函数(注重:不支持脚本文件,脚本文件使用时要改为函数文件),因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab公司推荐的使用方法。
例:基于COM的MATLAB与VC混编示例1、打开matlab新建一个M文件,这里采用与上例相同的函数,注意:不能是脚本文件。
浅析VC与matlab接口编程(一)

浅析VC与matlab接口编程(一)作者:孙科除了使用MATCOM之外,matlab与vc的混合编程还有其他的几种方法:1 通过matlab engine方式。
此种方法需要在机器上安装matlab软件,而且执行效率低,因此在实际应用中不常采用这种方法,在软件开发中也不可行,比较适合个人使用或做演示用。
2 直接调用matlab的c/c++数学函数库。
vc中可以直接使用matlab提供的c/c++数学函数,此方法需要对c/c++语言非常熟悉。
3 用matlab自带的matlab compiler.此种方法有很多限制:(1)不能转换脚本m文件,只能转换m函数;(2)不能使用matlab对象;(3)不能用input或者eval操作matlab空间变量;(4)不能动态的命名变量,然后用load或者save命令来操作,不能对使用load指令装载普通文本文件的m文件操作;(5)不能处理具有嵌套调用其他m文件的m文件;(6)不能使用matlab内联函数(7)不能对使用了java接口的matlab代码文件使用4 使用matlab的combuild工具:该方法简单,通用性强,几乎可以使用matlab的任何函数,因此在程序较大,调用函数较多时使用起来效果很好,此方法也是mathworks公司推荐的使用方法;5 使用matcom工具。
相比其他方法而言,有下列优点:(1)转换过程简单,容易实现;(2)可以方便的生成dll和exe文件;(3)不仅可以转换独立的脚本文件,也可以转换嵌套的脚本文件;(4)设置环境后,可以使用matlab工具箱函数;其缺点是:(1)对struct等类的支持有缺陷;(2)部分绘图语句无法实现或得不到准确的图像,尤其是三维图像。
在不涉及到三维作图以及m文件不大的情况下,使用效果很好。
Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具。
相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便得多。
MATLAB与VC混合编程配置设置

MATLAB与VC混合编程相关配置的设置MATLAB与VC的混合编程中,需要对电脑的“环境变量”和VC的“环境配置”进行设置,然后才可以进行程序的调用。
(1)电脑中“环境变量”的设置:对于win10系统控制面板→系统→高级系统设置→环境变量→系统变量→path中添加D:\softwares\MATLAB\ bin\win64,该路径是MATLAB中dll文件的路径,在path 中添加该路径的目的是让VC在运营时能够读取dll文件。
否则VC在运行时可能会出现“计算机丢失**.dll文件”的情况。
对于win7系统的“环境变量”设置,同样是在path中进行的。
(2)VC的环境配置首先需要建立一个新项目,如MyAdd.cpp。
项目→MyAdd属性→VC++目录→包含目录→D:\softwares\MATLAB \extern\include;项目→MyAdd属性→VC++目录→库目录→D:\softwares\MATLAB\installation document\extern\lib\win64\microsoft。
C/C++→常规→附加包含目录→D:\softwares\MATLAB \extern\include;C/C++→常规→调试信息格式→程序数据库(/Zi);链接器→常规→启用增量链接→是(/INCREMENTAL);链接器→常规→附加库目录→D:\softwares\MATLAB\ extern\lib\win64\microsoft;链接器→输入→附加依赖项→libMyAdd.lib,mclmcrrt.lib,libmx.lib,libmat.lib,mclmcr.lib。
其中在输入时这些lib之间用回车换行。
上述步骤的工作界面如下所示:需要注意:在进行VC与MATLAB混合编程的过程中,用到的环境是32位还是64位,在这里需要是相同的编程环境才可以相互调用,如:上图中如果是x32,则需要点击“配置管理器”进行重新设置。
Matlab与VC(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库

本文由wolf1sky贡献doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
Matlab 与 VC 混合编程 1:一、采用 Matcom1、目标1. 测试在 VC 中调用 MatrixC++库,生成矩阵并显示 2. 测试 VC 中调用.m 文件2、步骤2.1 目标 1<1>建立 VC 工程,添加库 v4501v.lib,有两种方法:?向工程中添加文件 v4501v.lib 在 Setting/link 中添加库 v4501v.lib(这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)二者选其一就可以了。
<2> 添加头文件 #include "matlib.h" (这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)建议:最好在工程中把文件 matlib.h 添加进来,方便查看函数详细说明 <3>现在就可以调用 Matrix中的C++函数了,例子如下:// Init matcom initM(MATCOM_VERSION); winaxes(AfxGetMainWnd()->GetSafeHwnd()); Mm a,b; a = (BR(1),2,3,semi,4,5,6,semi,7,8,9); a = transpose(a); b = (BR(1),2,3,semi,4,5,6,semi,7,8,9); m_1.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f %3f %3f \r\n",a.r(1,1),a.r(1,2),a.r(1,3),a.r(2,1),a.r(2,2),a.r(2,3),a.r(3,1),a.r(3,2),a. r(3,3));//m_1 是一个 CEdit 控件 UpdateData(FALSE); exitM();2.2 目标 2<1>首先用 Matlab 调试成功以下两个有依赖关系的.m 文件文件 1:equation.m function y = equation(a,b) y = a * b; 文件 2:CallE.m % function name function [o1,o2] = CallE(x) if (nargin ~= 1) error('arguments must be inputed!'); endif (x == 1) a = reshape(1:9,3,3); elseif (x == 2) a = reshape(11:19,3,3); else error('input error'); end b = magic(3); o1 = equation(a,b); o2 = o1 + 1; <2>将以上两个文件放在同一个目录下,启动 MatCom 编译运行 CallE.m, >> CallE(2) 则在同一目录下生成一个 DEBUG(或者是 Release,在 MatCom 的菜单项 Configuration 中选择)目录下可以找到相应的.cpp 及.h 文件,把它们全部拷贝到 VC 工程目录下,也可以自己建一个文件夹 <3>在 VC 项目中添加这些文件,并在头部添加相应.h 的引用,如下: #include "./matlib/equation.h" #include "./matlib/calle.h" <4>添加调用函数的代码,如下: Mm a,b,c; a = BR(2); 表示输入参数到输出参数的间隔,《MatrixLIB user's 详见calle(a,i_o,b,c); //i_o 是一个间隔符,Guide》m_2.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f \r\n",b.r(1,1),b.r(1,2),b.r(1,3),b.r(2,1),b.r(2,2),b.r(2,3),b.r(3,1),b.r(3,2),b. r(3,3)); %3f %3fUpdateData(FALSE);3、遇到的问题及解决方案<1>当在 VC 工程中添加由 Matcom 转换的 cpp 及 h 文件后,注:如果在编译中出现下列错误:fatal error C1010: unexpected end of file while looking for precompiled headerdirective 解决:进行下列设置:工程->设置-> C/C++ 选择 precompiled headers 选解决:择第一或第二项:自动选择预补偿页眉,如图:<2>使用Matcom 后,生成Debug 版没问题,而生成Release 时链接出错,nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj) 解决:解决:将"Project 属性" -> "C/C++" -> "代码生成(codegeneration)" -> "运行时库(run-time library)" 项下修改应用程序的默认标准库版本,我修改成 Debug Multithreads 就可以了,原因是安装Matcom 时库为调试版<3>在其它机器上运行出错解决:解决:将 ago4501.dll v4501v.dll glu32.dll opengl32.dll 附带发布即可 <4>关闭程序后进程没有退出解决:解决:添加语句winaxes(m_hWnd);参考文献1、何东健等.《数字图像处理》.西安电子科技大学出版社.20032、邓科.浅析 VC 与matlab 接口编程(一). VC 知识库,41 期3、邓科.浅析 VC 与 matlab 接口编程(二). VC 知识库,42 期4、Matcom 参考手册Matlab 与 VC 混合编程 2:二、通过 Matlab 引擎与 VC 混合编程--飞狼编程宝典--明明知道选择你是一个错误,却为何那么地坚持这个错误……基于 Matlab 引擎的混合编程方式无法脱离 Matlab 环境,却为何还要使用它?根据本人的实践,对于一般应用,如矩阵运算,图像操作等,使用 Matcom 就已经足够,而且能够脱离 Matlab 那个巨大的环境而独立运行,但是,对于很多好用的 Matlab 工具箱,我们却无法直接在 VC 中调用。
VC和matlab混合编程画图实践

VC和Matlab混合编程画图实践2013-03-14【摘要】在DSP软件开发中,基于代码的可移植性的需要,首先要基于VC平台开发出纯C定点版本。
为了对定点代码的精度和性能进行充分测试,需要对其进行定点仿真并与浮点的性能比较。
浮点代码的性能可以很容易的通过Matlab仿真得到,但由于VC与Matlab对仿真结果的保存形式不同,比对结果的过程需要人为完成。
并且VC对定点仿真的结果保存为文本形式,不够直观。
当仿真或测试条目较多时,这一过程将变得重复而繁琐,因此为了将这一过程变得更自动化、更直观,本实践介绍了一种利用VC调用Matlab动态链接库的方法,通过VC直接调用Matlab的方法进行画图,能够更直观、更方便的分析定浮点仿真结果的差异。
【关键词】Matlab Engine动态链接库VC定点仿真Matlab画图一、问题的提出在VC平台软件开发中,需要对实现的定点代码进行定点仿真,观测最后的BER曲线,并与浮点的结果做对比,观察其性能差异。
然而,VC平台的仿真结果只是保存在数组中的结果,不能直观的展示给测试人员,仍需人为的提取分析,这样便造成重复劳动和时间上的浪费,因此需要寻找一种简单易行的方法,实现将VC的仿真结果画图呈现出来。
二、解决思路Matlab作为数据仿真分析的工具十分强大,其包含了非常丰富的数学运算库和与外部工具的接口,众所周知,利用Matlab画图是十分方便的,只需将仿真结果,外加画图的参数传递给Matlab的命令函数,就能非常方便的完成画图,简单易行。
Matlab与VC的接口方式有很多种,如引擎的形式,COM 组件的形式,动态链接库的形式等等,因为动态链接库的形式在之前的实践中已经研究过,并且相对成熟,因此本实践将着重介绍将Matlab的函数编译成动态链接库供VC调用方法,对于引擎的和其他方式略做简单介绍。
三、实践情况3.1 工具与环境准备1)Matlab环境准备:本实践中采用的Matlab版本为R2011b。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab与VC混合编程小问题解答1.mwArray和mxArray有什么区别?mxArray是个结构体,而mwArray是个C++类。
首先,mxArray是Matlab C 函数库的结构体,而mwArray是Matlab C++ 函数库中对mxArray的包装类。
其次,二者的内存管理方式不同。
mxArray的内存管理方式比较松散,由于是C函数库,没有数据封装,必须对临时阵列和约束阵列的概念极为明确,并且须小心地防止内存泄漏(要多写好多代码)。
尽管有自动内存管理机制(mlfEnterNewContext,mlfReleasePreviousContext),仍然要处处调用mlfAssign,麻烦得很。
然而mwArray就好的多,一切交给C++对象去搞定,你只要放心地用就可以了。
不过Matlab C++函数库为了防止频繁内存分配和释放重写了内存分配和释放等函数。
你会发现对于mwArray a,b; a=b;实际上并没有生成两个相同数据块,只是指针,只有发成数据改变时才copy完整数据。
再次,这两个东西各自有一套与之相对应的函数。
函数的返回值类型不同,需要多加注意。
最后,用的时候mxArray要使用指针,而mwArray直接当类对象使。
如果你不是Hardcore 级的牛人或具有Hardcore倾向的潜牛人,我强烈建议你使用后者!举一个简单的例子:如果你需要计算c=a+b那么两者的区别是这样的:mxArray:void fun(){……double d_a=1,d_b=2;mxArray *a,*b,*c;mlfEnterNewContext(0,0);mlfAssign(&a,mlfScalar(d_a));mlfAssign(&b,mlfScalar(d_b));mlfAssign(&c,mlfPlus(a,b));……mlfReleasePreviousContext(0,0);mxDestroyArray(a);mxDestroyArray(b);mxDestroyArray(c);}mwArray:void fun(){……mwArray a,b,c;a=1;b=2;c=a+b;……}2. 如何把CString 添加到VARIANT中?#include <comdef.h>----------------------------------------------CString s = "/search?p=wwweer";VARIANT v;v = (_variant_t)s;AfxMessageBox((bstr_t)v);void ShowMessage(VARIANT v){if(v.vt == (VT_BYREF|VT_I1))::MessageBox(NULL, v.pcVal, "",MB_OK);。
}void CTestDlg::OnButton1(){CString s = "That's ok!";VARIANT v;v.vt = VT_BYREF|VT_I1;v.pcVal = s.GetBuffer(0);s.ReleaseBuffer();ShowMessage(v);}应该用CString::AllocString比较好,因为VARIANT主要是用来对付automation的VARIANT varValue;char strValue[64];CString str;strcpy(strValue,_bstr_t(&varValue));str = (CString)strValue;3.vc下使用matlab混合编程如何初始化**mxArray?x=mxCreateDoubleMatrix(m,n,mxREAL);//m行n列data[3][2]={...}memcpy(mxGetPr(x),data,6*sizeof(double));//把data中的数据给x,调用mlf***函数即可mxArray *out=NULL;//定义输出参数指针mlfModal1(int nargout, mxArray** x, mxArray* ceshi_data)第一个参数是函数输出参数个数,后面的是输出参数和输入参数,看你的mantlab函数就知道了,输入参数直接把定义的x放到那就行,输出参数需要你用字符串format一下。
如果提示x没有初始化,肯定是你没有加载matlab库或者头文件.4.实践经验:在VC中使用mcc编译得到的CPP文件/******************************/标题:实践经验:在VC中使用mcc编译得到的CPP文件作者:SCIEQQ: 826466Email: scie@发表位置: Matlab版您可以自由转发该帖,但不能删除该段,请保证文章的完整性/******************************/在本版中已经有好多篇帖子介绍如何在VC中使用由mcc命令编译得到的cpp文件,但其中有几个版本是针对以前版本的matlab写的,已经不适应于matlab6.5 或者连matlab6.1也不适应(由于目前没有安装matlab6.1,所以不确定,有一个帖子好像还是针对matlab5.3写的,例如:在这些文章中指明需要libmcc.lib,但在matlab6.5中已经没有这个文件,连libmcc.def 都没有)。
在我根据这些帖子进行实际操作的过程中,发现如下由cwit转帖的帖子《总结:m文件转化为c/c++语言文件,VC编译》/cgi-bin/ut/topic_show.cgi?id=30318&h=1&bpg=1&age=0内容是比较新的,我跟据该帖所述已经实验成功。
但在该帖中仍有一些问题,导致特定情况下的编译失败或者运行错误,我已经找到了解决方法。
上面提到的那篇文章对于如何用mcc编译m文件,以及如何在VC中设置各种选项已经说的比较清楚了,需要提醒大家注意的是:在第一次实验的时候一定要严格按照文中描述的来做,且勿遗漏,最好保证完全一致。
下面说一下我在按照上文操作时遇到的问题及解决方案(我的操作是在MFC AppWizard建立的Dialog Based程序的基础上进行的,其它类型的可能会不同)。
1. Release 模式编译失败。
文中提到要在project->Settings->Link->category 下拉框选Input->对象/库模块中加入附录A中所列出的内容,在Release模式下除添加以上内容外,还要添加msvcrtd.lib2.文中指出在调用编译的matlab 函数前应添加:libmmfileInitialize();libmwsglmInitialize();mlfHGInitialize(NULL,NULL);在调用后应添加:mlfHGWaitForFiguresToDie();mlfHGTerminate();libmmfileTerminate();libmwsglmTerminate();这样做第一次会正确显示图形窗口,但关闭图形窗口后第二次再调用就会出错。
解决方法是把mlfHGTerminate();libmmfileTerminate();libmwsglmTerminate();放到消息WM_DESTROY的相应函数OnDestroy里面去,或者其它在程序退出时才会执行的地方,去掉mlfHGWaitForFiguresToDie();再把libmmfileInitialize();libmwsglmInitialize();mlfHGInitialize(NULL,NULL);放到OnInitDialog函数里去,或者其它能保证只运行一次的地方。
最后感谢《总结:m文件转化为c/c++语言文件,VC编译》的原文作者,尽管连他的网名都不知道,感谢他把自己的经验写出来,我才能知道如何去做。
也感谢cwit,感谢他把这篇文章转过来,我才能看到。
也希望以后的转帖都能指明原作者及出处。
附例说明:本例是在winXP + VC6.0 + Matlab6.5下编译通过,编译好的程序只要附带mglinstaller.exe(在matlab的安装目录中)中的数学和图形库即可在没装matlab的机器上运行。
附件: 165105-Figure_peaks.zip (2003-12-14 22:31, 0 bytes)补充:按照一开始的做法:“1. Release 模式编译失败。
文中提到要在project->Settings->Link->category 下拉框选Input->对象/库模块中加入附录A中所列出的内容,在Release模式下除添加以上内容外,还要添加msvcrtd.lib ”这样做Release模式编译的程序在win98退出时发生错误,解决方法是:在project->Settings->Link->category 下拉框选Input->对象/库模块中再添加 mfc42d.lib,在Ignore Libraries里再添加 mfc42.libmcc是matlab的编译器可以把m程序编译为c或者c++程序,mex可以把c或者c++程序编译为matlab可以直接使用的dll。
编译为exe可以脱离matlab,但仍然需要matlab的数学函数库和图形函数库,这两个库是一大堆的dll文件。
需要附带这些库文件程序才能在目标机器上运行。
msvcrtd.lib是VC的运行库,与matlab没有关系,不在mglinstaller里面,需要从系统目录下拷贝过来。
请参照 /forum/viewthread.php?tid=159614设置头文件和链接库的路径4. 选择:工具--->选择,属性页选择“目录”,在include files里面加入:C:\MATLAB6P5\EXTERN\INCLUDEC:\MATLAB6P5\EXTERN\INCLUDE\CPP注意,根据你的matlab的安装位置的不同,要相应的修改上面的地址。
在Library files里面加入:C:\MATLAB6P5\EXTERN\LIB\WIN32C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC605.【转帖】总结:m文件转化为c/c++语言文件,VC编译[转帖]总结:m文件转化为c/c++语言文件,VC编译matlab使用很方便,但有时候一些特殊的应用需要我们将matlab中m格式的文件中的程序翻译成c/c++的形式的程序并在c/c++的编译器中进行编译,本文总结了一般的方法。