概述
整个过程如下:
1. 首先在R盘根目录下创建"DLL"文件夹,然后把spline.m和chckxy.m两个文件拷贝到"R:DLL"文件夹下(在我的机器上,spline.m位于文件夹"C:Program FilesMATLABR2012btoolboxmatlabpolyfun"下,chckxy.m位于文件夹"C:Program FilesMATLABR2012btoolboxmatlabpolyfunprivate"下)。
2. 在MATLAB中打开"R:DLLspline.m",修改第54行代码,把"chckxy"改为"mycheck",如图:
3. 把"R:chckxy.m"重命名为mycheck.m,如图:
4. 在MATLAB中打开"R:DLLmycheck.m",修改第1行代码,把函数名由"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"这三个文件是我们所需的。
6. 接下来,打开VS2010,单击"文件"菜单--"新建"--"项目":
选择"Visual C++"--"Win32 控制台应用程序",项目名称"SplineTest",位置在R盘根目录,点击"完成"。
7. 把"R:DLL"文件夹下的"libspline.dll"、"libspline.h"和"libspline.lib"三个文件拷贝到新建的SplineTest项目路径下(即"R:SplineTestSplineTest"下),如图:
8. 在"SplineTest"项目中添加libspline.h头文件。如图,在"解决方案资源管理器"中,右键单击"头文件"--"添加"--"现有项",把第7步中拷贝到"R:SplineTestSplineTest"下的头文件"libspline.h"添加到"SplineTest"项目中去。
9. 开始配置SplineTest项目属性。在"解决方案资源管理器"中,右键点击"SplineTest"--"属性",打开属性页:
在"SplineTest属性页",左边选中"配置属性"--"VC++ 目录",右边点击"包含目录"后的下拉框,点击"编辑",如图:
在弹出的"包含目录"对话框中,点击右上方的"新行"按钮,在列表框中输入MATLAB的include文件夹位置后,点击"确定"按钮(在我机器上,路径为"C:Program FilesMATLABR2012bexterninclude"),如图:
回到"SplineTest属性页",右边点击"库目录"后的下拉框,点击"编辑",弹出"库目录"对话框,同样点击"新行"按钮,在列表框中输入MATLAB的lib文件夹位置后确定(由于我的机器是64位系统,路径为"C:Program FilesMATLABR2012bexternlibwin64microsoft";如果您是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_APIvoid 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图看起来是这样:
打开"SplineTest"项目中的"SplineTest.cpp",模仿上述MATLAB代码编写C++代码如下:
1
// SplineTest.cpp : 定义控制台应用程序的入口点。
2
3
#include "stdafx.h"
4
#include "libspline.h" //增加头文件
5
#include
6
#include
7
#include
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<
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<
48
i++;
49
if(i%7 == 0) cout<
50
}
51
cout<
52
53
//终止调用
54
libsplineTerminate();
55
56
return 0;
57
}
运行上述代码,得到结果如下:
而对于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
结果没有问题,但慢是一如既往地慢。问题解决,完毕。
最后
以上就是自然唇膏为你收集整理的chckxy函数 matlab,在VS2010中调用MATLAB内建函数的全部内容,希望文章能够帮你解决chckxy函数 matlab,在VS2010中调用MATLAB内建函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复