win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

时间:2022-02-10 06:41:22

版权声明:

1、这篇教程参考如下:

参考1:matlab封装DLL动态链接库 再用VS2010调用(matlab VS混合编程)(转载)

参考2:matlab 2010b与VS2008 混合编程的实现

参考3:[原]Matlab代码转C++(二) —— mwArray

2、本着尊重原创,大家转载的时候请注明出处,此教程编写不易啊~~


下面开始介绍:win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

一、运行环境
1、win7_32位系统;
2、Microsoft Visual Studio 2008;(安装路径:C:\Program Files\Microsoft Visual Studio 9.0)
3、MATLAB R2010b。(安装路径:C:\Program Files\MATLAB\R2010b)

【注意】本文涉及的方法,可能对于高版本的Microsoft Visual Studio或者MATLAB不适用,也可能对于64位系统不适用。另外,建议将Microsoft Visual Studio 2008安装在上述路径中。有位网友说过:“新版本的VS+新版本的MATLAB+64位操作系统=无尽的烦恼”,我本人也深有体会。烦恼只要体现在:1)下文涉及到的一个命令“mbuild -setup”无法使用;2)配置流程繁琐易出错。上述的1~3的组合我是最满意的,配置起来也最简单,不需要添加什么环境变量之类的。嘿嘿,感觉自己好懒,见笑了~


二、任务要求

创建一个基于对话框的MFC程序,实现下图功能。当输入“X、Y、Z向量元素个数”并且按下“计算X、Y、Z数据并且绘图”按钮时,可以实现画图功能,图形界面与MATLAB相同,但是可以脱离MATLAB运行(即:MATLAB关闭时,按下按钮后依旧可以绘图)。X、Y、Z中数据满足如下关系式:

X[i-1]=(double)(i);

Y[i-1]=(double)(i+1);

Z[i-1]=(double)(i+2)。

i 是整数,从1到你所输入的“X、Y、Z向量元素个数”。

win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

三、具体过程

1、

打开MATLAB,创建一个名为“drawwithdata.m”的函数文件,其中的代码为:

function drawwithdata(X,Y,Z)
plot3(X,Y,Z,'.')
end

保存之。【注意】最好有个end与function对应。
2、

在MATLAB命令窗口输入代码:

mbuild -setup %“-”之前有空格,请注意!
然后出现:

Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n?

选择: y ,键入y后出现:

Select a compiler:
[1] Lcc-win32 C 2.4.1 in E:\MATLAB\R2010b\sys\lcc
[2] Microsoft Visual C++ 2008 SP1 in C:\Program Files\Microsoft Visual Studio 9.0
[0] None
即提示我们选择 编译器,2,键入 2 后

Please verify your choices:

Compiler: Microsoft Visual C++ 2008 SP1

Location: C:\Program Files\Microsoft Visual Studio 9.0

Are these correct [y]/n? 

选择: y ,键入y后出现:

****************************************************************************
Warning: Applications/components generated using Microsoft Visual Studio
2008 require that the Microsoft Visual Studio 2008 run-time
libraries be available on the computer used for deployment.
To redistribute your applications/components, be sure that the
deployment machine has these run-time libraries.
****************************************************************************

Trying to update options file: C:\Users\WangXu\AppData\Roaming\MathWorks\MATLAB\R2010b\compopts.bat
From template: C:\PROGRA~1\MATLAB\R2010b\bin\win32\mbuildopts\msvc90compp.bat

Done . . .
如果出现以上提示,则代表编译器设置完成了,我们就可用 .m 文件生成 .dll文件 了。

在命令窗口输入代码:

mcc -W cpplib:mydrawwithdata -T link:lib drawwithdata.m
其中,mydrawwithdata是生成的dll,lib的前缀名字,也就是你最后可以使用的dll以及lib库的名字;drawwithdata.m是需要编译的.m函数。
执行后,等待1~2分钟,编译完成后,在MATLAB路径下,得到了下图中的一些文件:

win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

标记的文件在Microsoft Visual Studio 2008调用的时候有用,其他文件目前没有使用。

3、

打开Microsoft Visual Studio 2008,新建一个名为“MyDrawwithdataTest”的基于对话框的MFC项目,并将上面生成的三个文件拷贝到该工程目录中。
4、

做一些配置工作

1)、选择菜单中“工具” 

2)、选择“选项” 
3)、在左边点击“项目和解决方案”前的小三角,再选择“VC++”目录 

4)、在右边的“显示以下内容的目录”中选择“包含文件” 
5)、在下面出现的列表中将以下目录添加进去:“C:\Program Files\MATLAB\R2010b\extern\include” (根据MATLAB的安装目录进行相应改写,以下略,添加方式很简单,可先点击列表的最下一行,再点击右边出现的按钮,再选择相应的目录即可) 
6)、再在右边的“显示以下内容的目录”中选择“库目录” 

7)、在下面出现的列表中将以下目录添加进去,添加方式同上:“C:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft”

【注意】1)到7)的步骤只需要设置这一次,以后不用再设置。

8)、选择“项目”菜单中的“MyDrawwithdataTest属性” 
9)、 在左边依次选择:“配置属性”->“链接器”->“输入” 
10)、在右边的“附加依赖项目”中,添加 ”mclmcrrt.lib  mydrawwithdata.lib”,其中”mydrawwithdata.lib”即为刚刚用matlab生成的 lib文件

【注意】8)到10)的步骤是针对本项目的设置,不同的项目设置不同(mclmcrrt.lib是相同的)。

5、

为对话框添加如下控件,并为“示例编辑框”添加一个成员变量int 型的 m_num。

win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

6、

双击“计算X、Y、Z数据并且绘图”按钮控件,自动跳至“MyDrawwithdataTestDlg.cpp : 实现文件”处的如下位置:

void CMyDrawwithdataTestDlg::OnBnClickedCalbutton()
{
// TODO: 在此添加控件通知处理程序代码

7、

先不急着添加代码,先在“MyDrawwithdataTestDlg.cpp”的开头include“mydrawwithdata.h”文件,代码如下:

// MyDrawwithdataTestDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "MyDrawwithdataTest.h"
#include "MyDrawwithdataTestDlg.h"
#include "mydrawwithdata.h"


8、

现在可以转到第6步,添加“通知处理程序代码”,最终,整个“OnBnClickedCalbutton”函数如下:

void CMyDrawwithdataTestDlg::OnBnClickedCalbutton()
{
// TODO: 在此添加控件通知处理程序代码

// 前处理
CString str;
if (!mydrawwithdataInitialize())
{
str.Format(_T("faild!\n"));
MessageBox(str);
return;
}

// 开始
try
{

UpdateData(TRUE);//刷新输入数据,将输入的数据传递给m_num

// mwArray 是C++的一种数据类型,它的用法可以见我的参考3:[原]Matlab代码转C++(二) —— mwArray
mwSize num=(mwSize)(m_num);
mwArray X(1,num,mxDOUBLE_CLASS);//声明一个mwArray类型的变量X,1乘num维的,里面的数据为mxDOUBLE_CLASS型
mwArray Y(1,num,mxDOUBLE_CLASS);
mwArray Z(1,num,mxDOUBLE_CLASS);
mwSize i;

// 在堆中新建数组指针
double *xData= new double[num];
double *yData= new double[num];
double *zData= new double[num];

for (i=1;i<=num;i++)
{
xData[i-1]=(double)(i);
yData[i-1]=double(i+1);
zData[i-1]=(double)(i+2);

}

X.SetData(xData,num);//为变量X赋值
Y.SetData(yData,num);
Z.SetData(zData,num);

delete [] xData;//析构之前在堆中创建的数组指针
delete [] yData;
delete [] zData;

drawwithdata(X,Y,Z);//由于include了“mydrawwithdata.h”,因此可以使用函数drawwithdata了。详情可以打开“mydrawwithdata.h”,///在最底下有函数drawwithdata的声明
mclWaitForFiguresToDie(NULL);//由于用到MATLAB的图形功能,所以必须使用此函数,否则图形会“闪退”

}
catch (mwException &e)
{
str.Format(_T("%s"),e.what());
MessageBox(str);
}
mydrawwithdataTerminate();

}



9、

运行编译,会出现如下错误

win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

选择“关闭程序”,接着出现

win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

选择“否”。

10、

再编译一次,耐心等待,最后运行界面如下

win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

11、

在输入框内输入“1000”,然后按下按钮,耐心等待,便出现

win7_32位系统下,VS2008与MATLAB R2010b的混合编程(绘图)

成功了!!大家可以看到,我的MATLAB并没有打开,却可以出现MATLAB的画图界面,而且支持“缩放”、“旋转”与“平移功能”。