VC2005如何调用MATLAB2009a中编写的m文件
2012-04-26 14:39
405 查看
本文是仿照这篇文章而来的:
《VC调用matlab中定义的.m文件中的函数的实例》
http://dev.csdn.net/article/26/26238.shtm
他的文章中使用的是VC6.0 + MATLAB6.5,有的东西已经不能使用了,因此我这里再写一篇如何用VC2005来调用MATLAB2009a中编写的m文件。
本例中的m文件源自前面写的一篇文章:
《图像的按列均值分布(matlab)》
http://hi.baidu.com/sumewanttobecomeagrandmaster/blog/item/d96a563f248202c87c1e7167.html
本文的输入是矩阵形式的灰度图像(二维矩阵),输出是按列均值分布向量的标准差(double数值),因此,修改后的m文件为:
function y = myfunc1(G)
%求解图像的按列均值分布,并求标准差
%输入为G,是一个8位灰度图像
[m,n]=size(G);
M=mean(G);%按列均值分布向量
i=1:1:n;
y=std(M);
m文件和函数同名。
下一步,在MATLAB中进行编译设置,键入"mex -setup”,选择VC2005:
继续输入"mbuild -setup",和上面一样仍然选择VC2005。
下一步,将m文件转换为可被VC调用的dll文件。在matlab中输入命令:
mcc -t -h -L C -W lib:ppp -T link:lib myfunc1.m
MATLAB会提示 -t -h -L 这三个参数已经不再使用了,不管它,工作目录中会生成一堆文件,其中的ppp.h ppp.lib ppp.dll三个文件是我们所需要的。
下一步,在VC2005中添加配合MATLAB编程的lib目录和include目录。
在 " \Tools \ Options \ Projects and Solutions \ VC++ Directories" 中,在 " Include files " 和 " Library files " 中分别添加下列目录(默认安装位置):
" C:\Program Files\MATLAB\R2009a\extern\include "
" C:\Program Files\MATLAB\R2009a\extern\lib\win32\microsoft "
下一步,使用VC2005新建工程,在 " \Project \ Properties \ Configuration Properties \ Linker \ Input " 中添加mclmcrrt.lib。将上述三个文件拷贝到VC工程所在目录,在Project菜单中Add Existing Item把ppp.h和ppp.lib添加到工程中。
下一步,编程。在恰当的位置添加 #include "ppp.h"。在ppp.h中可以看到上面m文件中那个函数的C语言声明:
extern LIB_ppp_C_API bool MW_CALL_CONV mlfMyfunc1(int nargout, mxArray** y, mxArray* G);
其中G和y就是m文件中的输入和输出,因此在C语言中如何调用它就水到渠成了:编译后点击button就能看到计算结果了:147.224319。
01 void CmatlabtestDlg::OnBnClickedButton1()
02 {
03 // TODO: Add your control notification handler code here
04 double mydata[3][3] = { //
测试数据,下面会解释
05 {255.0, 255.0, 255.0},
06 {0, 0, 0},
07 {255.0, 255.0, 255.0}
08 };
09
10 pppInitialize(); // 初始化
11
12 mxArray *G = mxCreateDoubleMatrix(3, 3, mxREAL); // 输入矩阵,3×3
13 mxArray *y = mxCreateDoubleMatrix(1, 1, mxREAL); // 调用MATLAB函数,参数都必须是矩阵形式
14
15 memcpy((void *)mxGetPr(G), (void *)mydata, sizeof(mydata)); //
拷贝数据
16
17 mlfMyfunc1(1, &y, G); // 调用ppp中的函数
18
19 double * md = mxGetPr(y); // 取得mxArray中的数据
20 double result = md[0]; // 数组第一个元素就是我们想要的值
21
22 CString str;
23 str.Format(_T("%f"),result);
24 MessageBox(str);
25
26 mxDestroyArray(G); // 释放内存
27 mxDestroyArray(y);
28
29 pppTerminate(); // 结束调用
30 }
我们可以在MATLAB中验证一下,输入下列语句:
a = [255 0 255]
std(a)
得到结果147.2243,可见这个程序是正确的。
关于MATLAB的使用有两个要点:
1.MATLAB是matrix laboratory的简称,一开始就设计为针对矩阵进行操作,因此调用它时的参数都是矩阵形式
2.MATLAB矩阵元素在内存中是按列存储的,上面程序中的测试数据是{{255,255,255},{0,0,0},{255,255,255}},它实际代表这个矩阵
255 0 255
255 0 255
255 0 255
(顺便说一下,在OpenCV中,矩阵在内存中的存储方式是按行存储的,且每行按4字节对齐)
《VC调用matlab中定义的.m文件中的函数的实例》
http://dev.csdn.net/article/26/26238.shtm
他的文章中使用的是VC6.0 + MATLAB6.5,有的东西已经不能使用了,因此我这里再写一篇如何用VC2005来调用MATLAB2009a中编写的m文件。
本例中的m文件源自前面写的一篇文章:
《图像的按列均值分布(matlab)》
http://hi.baidu.com/sumewanttobecomeagrandmaster/blog/item/d96a563f248202c87c1e7167.html
本文的输入是矩阵形式的灰度图像(二维矩阵),输出是按列均值分布向量的标准差(double数值),因此,修改后的m文件为:
function y = myfunc1(G)
%求解图像的按列均值分布,并求标准差
%输入为G,是一个8位灰度图像
[m,n]=size(G);
M=mean(G);%按列均值分布向量
i=1:1:n;
y=std(M);
m文件和函数同名。
下一步,在MATLAB中进行编译设置,键入"mex -setup”,选择VC2005:
继续输入"mbuild -setup",和上面一样仍然选择VC2005。
下一步,将m文件转换为可被VC调用的dll文件。在matlab中输入命令:
mcc -t -h -L C -W lib:ppp -T link:lib myfunc1.m
MATLAB会提示 -t -h -L 这三个参数已经不再使用了,不管它,工作目录中会生成一堆文件,其中的ppp.h ppp.lib ppp.dll三个文件是我们所需要的。
下一步,在VC2005中添加配合MATLAB编程的lib目录和include目录。
在 " \Tools \ Options \ Projects and Solutions \ VC++ Directories" 中,在 " Include files " 和 " Library files " 中分别添加下列目录(默认安装位置):
" C:\Program Files\MATLAB\R2009a\extern\include "
" C:\Program Files\MATLAB\R2009a\extern\lib\win32\microsoft "
下一步,使用VC2005新建工程,在 " \Project \ Properties \ Configuration Properties \ Linker \ Input " 中添加mclmcrrt.lib。将上述三个文件拷贝到VC工程所在目录,在Project菜单中Add Existing Item把ppp.h和ppp.lib添加到工程中。
下一步,编程。在恰当的位置添加 #include "ppp.h"。在ppp.h中可以看到上面m文件中那个函数的C语言声明:
extern LIB_ppp_C_API bool MW_CALL_CONV mlfMyfunc1(int nargout, mxArray** y, mxArray* G);
其中G和y就是m文件中的输入和输出,因此在C语言中如何调用它就水到渠成了:编译后点击button就能看到计算结果了:147.224319。
01 void CmatlabtestDlg::OnBnClickedButton1()
02 {
03 // TODO: Add your control notification handler code here
04 double mydata[3][3] = { //
测试数据,下面会解释
05 {255.0, 255.0, 255.0},
06 {0, 0, 0},
07 {255.0, 255.0, 255.0}
08 };
09
10 pppInitialize(); // 初始化
11
12 mxArray *G = mxCreateDoubleMatrix(3, 3, mxREAL); // 输入矩阵,3×3
13 mxArray *y = mxCreateDoubleMatrix(1, 1, mxREAL); // 调用MATLAB函数,参数都必须是矩阵形式
14
15 memcpy((void *)mxGetPr(G), (void *)mydata, sizeof(mydata)); //
拷贝数据
16
17 mlfMyfunc1(1, &y, G); // 调用ppp中的函数
18
19 double * md = mxGetPr(y); // 取得mxArray中的数据
20 double result = md[0]; // 数组第一个元素就是我们想要的值
21
22 CString str;
23 str.Format(_T("%f"),result);
24 MessageBox(str);
25
26 mxDestroyArray(G); // 释放内存
27 mxDestroyArray(y);
28
29 pppTerminate(); // 结束调用
30 }
我们可以在MATLAB中验证一下,输入下列语句:
a = [255 0 255]
std(a)
得到结果147.2243,可见这个程序是正确的。
关于MATLAB的使用有两个要点:
1.MATLAB是matrix laboratory的简称,一开始就设计为针对矩阵进行操作,因此调用它时的参数都是矩阵形式
2.MATLAB矩阵元素在内存中是按列存储的,上面程序中的测试数据是{{255,255,255},{0,0,0},{255,255,255}},它实际代表这个矩阵
255 0 255
255 0 255
255 0 255
(顺便说一下,在OpenCV中,矩阵在内存中的存储方式是按行存储的,且每行按4字节对齐)
相关文章推荐
- 如何编辑用VC2005编写的exe文件的属性
- 在VFP中如何调用VB编写的.DLL或.EXE文件
- 分享如何在VB中调用VC编写的DLL
- 如何在QT下调用VC/MFC编写的DLL,分为两种方式。
- Java如何通过VC调用VB编写的COM
- VC如何调用DLL文件
- 如何在VC2005调用g++编译器
- VC下如何调用控制台命令以及其他可执行文件
- 如何用 VC++ 编写 MIDI 文件播放程序
- 如何用VC编写供PB调用的DLL (转)
- 64位win7下vc2010如何调用matlab2012a中生成的dll文件
- 如何用vc2005托管代码编写一个oledb创建access2003数据库的程序?
- 如何编写和调用资源文件
- 如何在VC中汇编,调用Nasm编写的函数
- vc编写Dll文件和调用的方法
- 如何用VC++编写MIDI文件播放程序
- 如何在VB中调用VC编写的DLL
- 如何用VB编写自己的DLL文件,并调用其中的函数
- qt调用vc编写库文件的方法
- DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用