整个过程如下:
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",如图:
3. 把"R:\chckxy.m"重命名为mycheck.m,如图:
4. 在MATLAB中打开"R:\DLL\mycheck.m",修改第1行代码,把函数名由"chckxy"改为"mycheck",如图:
5. 在MATLAB命令窗口下输入mcc指令编译spline.m,即:
2 | >> mcc -W cpplib:libspline -T link:lib spline.m |
完成后,在"R:\DLL"下会生成如下的文件,依然,其中的"libspline.dll"、"libspline.h"和"libspline.lib"这三个文件是我们所需的。
6. 接下来,打开VS2010,单击"文件"菜单--"新建"--"项目":
选择"Visual C++"--"Win32 控制台应用程序",项目名称"SplineTest",位置在R盘根目录,点击"完成"。
7. 把"R:\DLL"文件夹下的"libspline.dll"、"libspline.h"和"libspline.lib"三个文件拷贝到新建的SplineTest项目路径下(即"R:\SplineTest\SplineTest\"下),如图:
8. 在"SplineTest"项目中添加libspline.h头文件。如图,在"解决方案资源管理器"中,右键单击"头文件"--"添加"--"现有项",把第7步中拷贝到"R:\SplineTest\SplineTest\"下的头文件"libspline.h"添加到"SplineTest"项目中去。
9. 开始配置SplineTest项目属性。在"解决方案资源管理器"中,右键点击"SplineTest"--"属性",打开属性页:
在"SplineTest属性页",左边选中"配置属性"--"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","确定"。
10. 最后,由于我是64位系统,需要配置成64位的方案平台(对于32位的系统,此步可跳过)。以"Debug"版本为例,点击工具栏中"Win32"后的下拉列表,选择"配置管理器",如图:
在弹出的"配置管理器"对话框中,点击"活动方案解决平台"的下拉列表框,选择"新建":
接着,在弹出的"新建解决方案平台"对话框中,一般会自动出现"x64","从此处复制设置"为"Win32",并自动勾选"创建新的项目平台",点击"确定"按钮。这就意味着之前我们对包含目录、库目录以及链接器的设置已被复制到64位平台中。
回到"配置管理器"对话框,可以看到"活动方案解决平台"已为"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调用示例:
上述代码的plot图看起来是这样:
打开"SplineTest"项目中的"SplineTest.cpp",模仿上述MATLAB代码编写C++代码如下:
4 | #include "libspline.h" //增加头文件 |
10 | int _tmain( int argc, _TCHAR* argv[]) |
13 | if (!libsplineInitialize()) |
17 | double x[1][11], y[1][11]; |
21 | y[0][i] = sin (x[0][i]); |
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); |
36 | mwXX.SetData(*xx, 41); |
37 | mwYY.SetData(*yy, 41); |
39 | spline(1, mwYY, mwX, mwY, mwXX); |
43 | for (j = 0; j < 41; j++) |
46 | yy[0][j] = mwYY.Get(1,j+1); |
47 | cout<<setprecision(4)<<right<<setw(10)<<yy[0][j]; |
49 | if (i%7 == 0) cout<<endl; |
运行上述代码,得到结果如下:
而对于spline函数,在MATLAB中的调用结果是:
3 | 0 0.2692 0.5017 0.6938 0.8415 0.9408 0.9878 |
5 | 0.9786 0.9093 0.7789 0.5982 0.3810 0.1411 -0.1075 |
7 | -0.3501 -0.5715 -0.7568 -0.8928 -0.9742 -0.9974 -0.9589 |
9 | -0.8578 -0.7032 -0.5065 -0.2794 -0.0342 0.2142 0.4498 |
11 | 0.6570 0.8215 0.9357 0.9937 0.9894 0.9196 0.7927 |
13 | 0.6198 0.4121 0.1807 -0.0632 -0.3085 -0.5440 |
结果没有问题,但慢是一如既往地慢。问题解决,完毕。