在VS2010中调用MATLAB内建函数

整个过程如下:

1. 首先在R盘根目录下创建"DLL"文件夹,然后把spline.m和chckxy.m两个文件拷贝到"R:\DLL"文件夹下(在我的机器上,spline.m位于文件夹"C:\Program Files\MATLAB\R2012b\toolbox\matlab\polyfun\"下,chckxy.m位于文件夹"C:\Program Files\MATLAB\R2012b\toolbox\matlab\polyfun\private\"下)。

2. 在MATLAB中打开"R:\DLL\spline.m",修改第54行代码,把"chckxy"改为"mycheck",如图:

修改R:\DLL\spline.m

3. 把"R:\chckxy.m"重命名为mycheck.m,如图:

将R:\DLL\chckxy.m重命名为mycheck.m

4. 在MATLAB中打开"R:\DLL\mycheck.m",修改第1行代码,把函数名由"chckxy"改为"mycheck",如图:

修改函数名chckxy为mycheck

5. 在MATLAB命令窗口下输入mcc指令编译spline.m,即:

1 >> cd R:\DLL
2 >> mcc -W cpplib:libspline -T link:lib spline.m

完成后,在"R:\DLL"下会生成如下的文件,依然,其中的"libspline.dll"、"libspline.h"和"libspline.lib"这三个文件是我们所需的。

mcc生成的文件

6. 接下来,打开VS2010,单击"文件"菜单--"新建"--"项目":

新建项目

选择"Visual C++"--"Win32 控制台应用程序",项目名称"SplineTest",位置在R盘根目录,点击"完成"。

Visual C++--Win32 控制台应用程序--SplineTest

7. 把"R:\DLL"文件夹下的"libspline.dll"、"libspline.h"和"libspline.lib"三个文件拷贝到新建的SplineTest项目路径下(即"R:\SplineTest\SplineTest\"下),如图:

复制DLL到SplineTest项目路径

8. 在"SplineTest"项目中添加libspline.h头文件。如图,在"解决方案资源管理器"中,右键单击"头文件"--"添加"--"现有项",把第7步中拷贝到"R:\SplineTest\SplineTest\"下的头文件"libspline.h"添加到"SplineTest"项目中去。

在项目中添加libspline.h头文件

9. 开始配置SplineTest项目属性。在"解决方案资源管理器"中,右键点击"SplineTest"--"属性",打开属性页:

解决方案资源管理器--SplineTest属性

在"SplineTest属性页",左边选中"配置属性"--"VC++ 目录",右边点击"包含目录"后的下拉框,点击"编辑",如图:

VC++ 目录--包含目录

在弹出的"包含目录"对话框中,点击右上方的"新行"按钮,在列表框中输入MATLAB的include文件夹位置后,点击"确定"按钮(在我机器上,路径为"C:\Program Files\MATLAB\R2012b\extern\include"),如图:

编辑包含目录

回到"SplineTest属性页",右边点击"库目录"后的下拉框,点击"编辑",弹出"库目录"对话框,同样点击"新行"按钮,在列表框中输入MATLAB的lib文件夹位置后确定(由于我的机器是64位系统,路径为"C:\Program Files\MATLAB\R2012b\extern\lib\win64\microsoft";如果您是32位系统,路径应该与"win32"相关)如图:

编辑库目录

再次回到"SplineTest属性页",左边选中"配置属性"--"链接器"--"输入",右边点击"附加依赖项"后的下拉框,点击"编辑",如图:

编辑附加依赖项

在弹出的"附加依赖项"对话框中,输入所需的两个lib文件:"mclmcrrt.lib"和"libspline.lib","确定"。

添加所需的lib

10. 最后,由于我是64位系统,需要配置成64位的方案平台(对于32位的系统,此步可跳过)。以"Debug"版本为例,点击工具栏中"Win32"后的下拉列表,选择"配置管理器",如图:

配置管理器

在弹出的"配置管理器"对话框中,点击"活动方案解决平台"的下拉列表框,选择"新建":

新建活动解决方案平台

接着,在弹出的"新建解决方案平台"对话框中,一般会自动出现"x64","从此处复制设置"为"Win32",并自动勾选"创建新的项目平台",点击"确定"按钮。这就意味着之前我们对包含目录、库目录以及链接器的设置已被复制到64位平台中。

新建解决方案平台

回到"配置管理器"对话框,可以看到"活动方案解决平台"已为"x64",点击"关闭"按钮。

x64活动解决方案平台

至此,对"SplineTest"项目配置完毕。

11. 接下来,就是在VS2010中编写C++代码调用spline函数了。参考在VC++6.0中调用MATLAB生成的DLL中的四. 编写代码调用DLL,我们编写类似的代码。可以看到,在加入"SplineTest"项目中的"libspline.h"的第109行,包含有spline函数的声明:

1 extern LIB_libspline_CPP_API void MW_CALL_CONV spline(int nargout, mwArray& output, const mwArray& x, const mwArray& y, const mwArray& xx);

该声明表示spline的调用接受5个参数:
第1个参数nargout表示返回值的个数,由于只有一个返回值,所以nargout为1;
第2个参数output表示返回值;
第3个参数x和第4个参数y表示的是样点数据;
第5个参数xx表示插值的数据点。

为了验证所编写的C++程序对spline函数的调用结果,与MATLAB中的调用结果是否一致,我使用了MATLAB帮助文件中的spline调用示例:

1 x = 0:10;
2 y = sin(x);
3 xx = 0:.25:10;
4 yy = spline(x,y,xx)
5 plot(x,y,'o',xx,yy);

上述代码的plot图看起来是这样:

plot

打开"SplineTest"项目中的"SplineTest.cpp",模仿上述MATLAB代码编写C++代码如下:

1 // SplineTest.cpp : 定义控制台应用程序的入口点。
2  
3 #include "stdafx.h"
4 #include "libspline.h"  //增加头文件
5 #include <cmath>
6 #include <iostream>
7 #include <iomanip>
8 using namespace std;
9  
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12     //初始化lib(必须)
13     if (!libsplineInitialize())
14         return -1;
15  
16     int i, j;
17     double x[1][11], y[1][11];
18     for(i=0; i<11; i++)
19     {
20         x[0][i] = i;
21         y[0][i] = sin(x[0][i]);
22     }
23  
24     double xx[1][41];
25     for(i=0; i<41; i++)
26         xx[0][i] = i*0.25;
27  
28     double yy[1][41];
29  
30     mwArray mwX(1,11,mxDOUBLE_CLASS);
31     mwArray mwY(1,11,mxDOUBLE_CLASS);
32     mwArray mwXX(1,41,mxDOUBLE_CLASS);
33     mwArray mwYY(1,41,mxDOUBLE_CLASS);
34     mwX.SetData(*x, 11);
35     mwY.SetData(*y, 11);
36     mwXX.SetData(*xx, 41);
37     mwYY.SetData(*yy, 41);
38  
39     spline(1, mwYY, mwX, mwY, mwXX);    //调用spline
40  
41     cout<<"yy = "<<endl;
42     i = 0;
43     for(j = 0; j < 41; j++)
44     {
45         //Get第一个参数表示用1个下标访问元素,j+1是列号(MATLAB下标从1开始,而C++从0开始,故做+1操作)
46         yy[0][j] = mwYY.Get(1,j+1);
47         cout<<setprecision(4)<<right<<setw(10)<<yy[0][j];
48         i++;
49         if(i%7 == 0) cout<<endl;  //换行
50     }
51     cout<<endl;
52  
53     //终止调用
54     libsplineTerminate();
55      
56     return 0;
57 }

运行上述代码,得到结果如下:

C++运行结果

而对于spline函数,在MATLAB中的调用结果是:

1 yy =
2   Columns 1 through 7
3          0    0.2692    0.5017    0.6938    0.8415    0.9408    0.9878
4   Columns 8 through 14
5     0.9786    0.9093    0.7789    0.5982    0.3810    0.1411   -0.1075
6   Columns 15 through 21
7    -0.3501   -0.5715   -0.7568   -0.8928   -0.9742   -0.9974   -0.9589
8   Columns 22 through 28
9    -0.8578   -0.7032   -0.5065   -0.2794   -0.0342    0.2142    0.4498
10   Columns 29 through 35
11     0.6570    0.8215    0.9357    0.9937    0.9894    0.9196    0.7927
12   Columns 36 through 41
13     0.6198    0.4121    0.1807   -0.0632   -0.3085   -0.5440

结果没有问题,但慢是一如既往地慢。问题解决,完毕。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值