m文件转换示例-Test2

“Test2”是以MFC创建的对话框工程,在该对话框中调用经转换后的m文件以完成正弦函数和余弦函数曲线绘制,其实现步骤为:

(1)编写m文件“Mysin.m”和“Mycos.m”

code.vc
%////////// Mysin.m 程序清单////////////
function Mysin(x1,x2)
X=x1:0.1:x2;
Y=sin(X);
plot(X,Y);
%////////// Mycos.m 程序清单////////////
function Mycos(x1,x2)
X=x1:0.1:x2;
Y=cos(X);
plot(X,Y);
//////////////////////////////////////////////

(2)创建VC工程“Test2”

运行VisualC++并单击File->New,打开Project对话框来创建Test2工程。选取MFC AppWizard (exe) (图3-7)。在loctation编辑框中输入欲创建工程的保存路径,在Project name编辑框中输入工程名如“Test2”,单击OK进入下一步工程设置对话框,选取“Dialog based”,单击Finish完成 “Test2” 工程创建。

Document Image

图3-7 Test2 工程创建

(3) 转换m文件“Mysin.m”和“Mycos.m”

单击Visual MATcom工具栏上的m++图标,选择保存过的MATLAB文件Mysin.m进行转换,完成后再次单击m++图标,选择Mycos.m转换(如果有多个m文件,可逐个添加并转换)。如果看到的转化信息提示没有错误就可以观察到此时在FileView标签中多了m-files、C++files created from m-files、MATrix<lib>和External Dependencies等文件夹(图3-8)。在相应的文件夹下增加了Mycos.m、Mysin.m、Mycos.cpp、Mysin.cpp、v4501v.lib、Mycos.h、Mysin.h和matlib.h等文件。表明m文件转换成功。分别在“Mycos.h”和“Mysin.h”文件中添加头文件“matlib.h”,进行编译,若编译成功,进入下一步;否则,表明m文件中存在错误,可双击m-files目录下相应的m文件进行修改,并重新转换直到没有错误报告为止。

code.vc
//////////// Mycos.h 文件清单
#include "matlib.h" ////////////////需添加"matlib.h"头文件,否则,编译时报错
#ifndef __Mycos_h
#define __Mycos_h
Mm Mycos(Mm x1, Mm x2);
#endif // __Mycos_h
//////////// Mysin.h 文件清单
#include "matlib.h" /////////////////需添加"matlib.h"头文件,否则,编译时报错
#ifndef __Mysin_h
#define __Mysin_h
Mm Mysin(Mm x1, Mm x2);
#endif // __Mysin_h
Document Image

图3-8 Mysin.m和Mycos.m文件转换结果

(4)在VC工程“Test2”中调用转换后函数“Mysin”和“Mycos”

•创建如图3-9所示对话框界面,并按表3-2设置各控件属性。

表3-2 Test2对话框控件属性

控件属性 控制ID 说明
Edit Box IDC_EDIT_x1 接受用户输入的左端点x1,与之相连的变量为m_x1
Edit Box IDC_EDIT_x2 接受用户输入的左端点x2,与之相连的变量为m_x2
Button IDC_BUTTON_MySin 鼠标左键单击该控件,调用Mysin函数并绘制正弦曲线
Button IDC_BUTTON_MyCos 鼠标左键单击该控件,调用Mycos函数并绘制余弦曲线
Static Text IDC_Statistic_MySin 用于显示正弦曲线
Static Text IDC_Statistic_MyCos 用于显示正弦曲线
Document Image

图3-9 Test2对话框

•添加头文件:

code.vc
#include "Mysin.h"
#include "Mycos.h"
#include "matlib.h"

•为IDC_BUTTON_MySin添加响应代码:

code.vc
void CTest2Dlg::OnBUTTONMySin()
{
double x1,x2;
UpdateData(TRUE); ////////////////////////// 将编辑框中输入值赋给与之相连的变量
 x1=(double)m_x1;  x2=(double)m_x2;
CWnd* psin=(CWnd*)GetDlgItem(IDC_Statistic_MySin);
 Mm plothandle=winaxes(psin->m_hWnd); ///////////读取图形句柄
 initM(MATCOM_VERSION); //////////////初始化matlib库
Mysin(x1,x2); //////////////////// 调用转换生成的函数
 exitM();	  /////////////////////////// 退出matlib库
}

•为IDC_BUTTON_MyCos添加响应代码:

code.vc
void CTest2Dlg::OnBUTTONMyCos()
{
double x1,x2;
UpdateData(TRUE);  ////////////////////////// 将编辑框中输入值赋给与之相连的变量
 x1=(double)m_x1;  x2=(double)m_x2;
CWnd* pcos=(CWnd*)GetDlgItem(IDC_Statistic_MyCos);
 Mm plothandle=winaxes(pcos->m_hWnd);  ///////////读取图形句柄
initM(MATCOM_VERSION);  //////////////初始化matlib库
 Mycos(x1,x2);  //////////////////// 调用转换生成的函数
 exitM(); /////////////////////////// 退出matlib库
}

•编译链接Test2工程:

按一般的C++程序进行编译链接Test2工程,这其中,由于Mysin.h和Mycos.h函数定义文件是相应的m文件转换生成的,生新编译整个工程时,这两个文件同时重新转换,VC++询问用户外部Mysin.h和Mycos.h已发生修改,是否重新加载这两个文件时,一般选择不重新加载,因重新转换生成的Mysin.h和Mycos.h文件中,没有包含“matlib.h”头文件,需用户手动添加,若没有包含该文件,编译器不能识别Mm数据类型而发生错误。

•执行Test2.exe:

执行Test2.exe文件后,得如图3-10所示对话框,在编辑框中输入0和25(近似值),单击sin

执行Test2.exe文件后,得如图3-10所示对话框,在编辑框中输入0和25(近似值),单击sin和cos按钮后,在左框中绘制了相应的曲线。

Document Image

图3-10 Test2运行结果

(5)独立应用程序发布

通过MATcom把.m文件编译为为stand_alone的程序,一般不需要MATLAB系统,仅需拷贝一些必要的dll文件,这些文件主要有:v4501v.dll、ago4501.dll、icudt24l.dll以及%MATLAB%\bin\win32\目录中以lib开头的dll文件,当然,并不是每个独立应用程序都需要所有以lib开头的dll文件,只是将这些lib*.dll文件都拷贝后,较为方便。