VC与matlab混编之VC调用matlab程序
2014-08-04 09:25
323 查看
使用VC6.0与VS2008,在配置上面都是类似的,唯一的区别在与用蓝色标出的部分
一. MATLAB Compiler
配置MATLAB编译器,主要是在MATLAB的命令窗口先后输入两条命令:"mex -setup"和"mbuild -setup",然后选择对应的编译器即可。由于使用VC++6.0,所以在我的机器上,选择编译器的地方都是输入3;需要输入[y]/n的地方就输入y。(注意第1行、第10行、第19行、第26行、第53行、第62行、第71行和第78行。)
1. 做最简单的MATLAB程序,代码如下:二. 编写MATLAB代码
然后在R盘根目录下新建DLL文件夹,把上面的代码存到该文件夹下,文件名为Add.m
2. 在MATLAB命令窗口下输入:
这样,在"R:\DLL"文件夹下,会生成一堆文件,其中有三个是需要的:"libAdd.dll"、"libAdd.h"和"libAdd.lib"。
三. 配置工程环境
1. 打开VC后,新建一个Win32 Console Application,工程名MATLABDLL,存放到R盘根目录。
2. 进入工程后,在工程中新建一个C++ Source File,命名为Test。
3. 把上面生成的"R:\DLL"中的"libAdd.dll"、"libAdd.h"和"libAdd.lib"三个文件,拷贝到"R:\MATLABDLL"目录下。
4. 回到VC6,在工程中右键点击"Header Files",选择"Add Files to Folder",把"R:\MATLABDLL"下的"libAdd.h"添加进工程。
双击打开"libAdd.h",把代码拖到最后,可以看到这么一行:
可见Add函数在C++中调用和在MATLAB中调用不一样,需要提供4个参数,第一个参数是返回值的个数(本例中只有一个返回值,故为1),第二个到第四个参数恰好是输出和输入(都是mwArray引用,后面再来看怎么用它)。
5. 配置工程MATLABDLL的Include Files环境,选择"Tools"菜单中的"Options"选项:
进入到"Directories"选项卡,选择"Include files",把MATLAB安装路径下的include文件夹加入,我本机的路径是" C:\Program Files\MATLAB\R2011b\extern\include"。
6. 配置工程MATLABDLL的Library files环境:依旧在"Directories"选项卡下,选择"Library files",把MATLAB安装路径下的lib文件夹加入,我本机的路径是"C:\Program Files\MATLAB\R2011b\extern\lib\win32\microsoft"。这里需要注意的是,该路径下有" mclmcrrt.lib"文件,是我们需要的。
7. 选择"Project"菜单中"Settings"选项:
进入"Link"选项卡,Category选择"Input",把"mclmcrrt.lib"和"libAdd.lib"加在最后。(这里需要注意的是,如果你的代码要分别生成Debug和Release版程序,则在左边"Settings For"中对"Win32 Debug"和"Win32 Release"都进行这样的设置。参考资料[3]中提示要加入以下几个LIB库:mclmcrrt.lib, mclmcr.lib, mclbase.lib, mclcommain.lib,这里暂时加第一个就够了。)
至此,环境配置完毕。
四. 编写代码调用DLL
在工程中打开"Test.cpp",编写如下代码。该代码中包含两段对Add函数的测试,第一段是测试两个整数相加,第二段是测试两个矩阵相加。
几点说明:
(1) 第7行初始化lib的代码貌似是必须的,否则我这里运行出错;而第44行和第45行的终止调用,貌似注释掉也没有什么影响。
(2) mwArray对象有多种初始化方式,这里第13-15行表示初始化成1x1的int32类型对象,第25-27行表示初始化成2x2的double类型对象。
(3) SetData函数第一个参数是一个mwArray型的一级指针,第二个参数表示元素个数。由于a,b是一个int型的变量,故第16-17行对a,b做取地址运算;而da和db由于是二维数组名,即二级指针常量,故第28-29行对da,db做了一级指针引用。
(4) Get函数也有多种调用形式。第19行调用中,Get函数第一个参数1,表示只用1个下标来访问(类似于MATLAB中可以把一个矩阵看作是一个向量,以列为先序),第二个参数1表示访问第1个元素;而第37行调用中,Get函数第一个参数2,表示用2个下标来访问(i是行索引,j是列索引,又由于是以列为先序,所以j在前,i在后),同时由于MATLAB中下标是从1开始,而C++中下标是从0开始,故做了j+1和i+1操作。
运行代码,程序的执行结果是:
一. MATLAB Compiler
配置MATLAB编译器,主要是在MATLAB的命令窗口先后输入两条命令:"mex -setup"和"mbuild -setup",然后选择对应的编译器即可。由于使用VC++6.0,所以在我的机器上,选择编译器的地方都是输入3;需要输入[y]/n的地方就输入y。(注意第1行、第10行、第19行、第26行、第53行、第62行、第71行和第78行。)
1. 做最简单的MATLAB程序,代码如下:二. 编写MATLAB代码
1 | function C = Add(A,B) |
2 | C = A+ B; |
2. 在MATLAB命令窗口下输入:
1 | >> cd R:\DLL |
2 | >> mcc -W cpplib:libAdd -T link:lib Add.m |
三. 配置工程环境
1. 打开VC后,新建一个Win32 Console Application,工程名MATLABDLL,存放到R盘根目录。
2. 进入工程后,在工程中新建一个C++ Source File,命名为Test。
3. 把上面生成的"R:\DLL"中的"libAdd.dll"、"libAdd.h"和"libAdd.lib"三个文件,拷贝到"R:\MATLABDLL"目录下。
4. 回到VC6,在工程中右键点击"Header Files",选择"Add Files to Folder",把"R:\MATLABDLL"下的"libAdd.h"添加进工程。
双击打开"libAdd.h",把代码拖到最后,可以看到这么一行:
1 | extern LIB_libAdd_CPP_API void MW_CALL_CONV Add( int nargout, mwArray& C, const mwArray& A, const mwArray& B); |
5. 配置工程MATLABDLL的Include Files环境,选择"Tools"菜单中的"Options"选项:
进入到"Directories"选项卡,选择"Include files",把MATLAB安装路径下的include文件夹加入,我本机的路径是" C:\Program Files\MATLAB\R2011b\extern\include"。
6. 配置工程MATLABDLL的Library files环境:依旧在"Directories"选项卡下,选择"Library files",把MATLAB安装路径下的lib文件夹加入,我本机的路径是"C:\Program Files\MATLAB\R2011b\extern\lib\win32\microsoft"。这里需要注意的是,该路径下有" mclmcrrt.lib"文件,是我们需要的。
7. 选择"Project"菜单中"Settings"选项:
进入"Link"选项卡,Category选择"Input",把"mclmcrrt.lib"和"libAdd.lib"加在最后。(这里需要注意的是,如果你的代码要分别生成Debug和Release版程序,则在左边"Settings For"中对"Win32 Debug"和"Win32 Release"都进行这样的设置。参考资料[3]中提示要加入以下几个LIB库:mclmcrrt.lib, mclmcr.lib, mclbase.lib, mclcommain.lib,这里暂时加第一个就够了。)
至此,环境配置完毕。
四. 编写代码调用DLL
在工程中打开"Test.cpp",编写如下代码。该代码中包含两段对Add函数的测试,第一段是测试两个整数相加,第二段是测试两个矩阵相加。
1 | #include "iostream.h" |
2 | #include "libAdd.h" |
3 |
4 | int main() |
5 | { |
6 | //初始化lib(必须) |
7 | if (!libAddInitialize()) |
8 | return -1; |
9 |
10 | //测试两个整数相加 |
11 | int a = 10, b = 20; |
12 | int c; |
13 | mwArray mwA(1,1,mxINT32_CLASS); |
14 | mwArray mwB(1,1,mxINT32_CLASS); |
15 | mwArray mwC(1,1,mxINT32_CLASS); |
16 | mwA.SetData(&a, 1); |
17 | mwB.SetData(&b, 1); |
18 | Add(1, mwC, mwA, mwB); |
19 | c = mwC.Get(1,1); |
20 | cout<< "c = " <<c<<endl<<endl; |
21 |
22 | //测试两个double型矩阵相加 |
23 | double da[2][2] = {1,2,3,4}, db[2][2] = {5,6,7,8}; |
24 | double dc[2][2]; |
25 | mwArray mwDA(2,2,mxDOUBLE_CLASS); |
26 | mwArray mwDB(2,2,mxDOUBLE_CLASS); |
27 | mwArray mwDC(2,2,mxDOUBLE_CLASS); |
28 | mwDA.SetData(*da, 4); |
29 | mwDB.SetData(*db, 4); |
30 | Add(1, mwDC, mwDA, mwDB); |
31 | cout<< "dc = " <<endl; |
32 | for ( int i = 0; i < 2; i++) |
33 | { |
34 | for ( int j = 0; j < 2; j++) |
35 | { |
36 | //Get第一个参数表示用2个下标访问元素(即i和j),j+1是列号,i+1是行号(MATLAB要求以列为先序) |
37 | dc[i][j] = mwDC.Get(2,j+1,i+1); |
38 | cout<< " " <<dc[i][j]; |
39 | } |
40 | cout<<endl; |
41 | } |
42 |
43 | //终止调用 |
44 | libAddTerminate(); |
45 | //mclTerminateApplication(); |
46 | return 0; |
47 | } |
(1) 第7行初始化lib的代码貌似是必须的,否则我这里运行出错;而第44行和第45行的终止调用,貌似注释掉也没有什么影响。
(2) mwArray对象有多种初始化方式,这里第13-15行表示初始化成1x1的int32类型对象,第25-27行表示初始化成2x2的double类型对象。
(3) SetData函数第一个参数是一个mwArray型的一级指针,第二个参数表示元素个数。由于a,b是一个int型的变量,故第16-17行对a,b做取地址运算;而da和db由于是二维数组名,即二级指针常量,故第28-29行对da,db做了一级指针引用。
(4) Get函数也有多种调用形式。第19行调用中,Get函数第一个参数1,表示只用1个下标来访问(类似于MATLAB中可以把一个矩阵看作是一个向量,以列为先序),第二个参数1表示访问第1个元素;而第37行调用中,Get函数第一个参数2,表示用2个下标来访问(i是行索引,j是列索引,又由于是以列为先序,所以j在前,i在后),同时由于MATLAB中下标是从1开始,而C++中下标是从0开始,故做了j+1和i+1操作。
运行代码,程序的执行结果是:
相关文章推荐
- VS或VC调用matlab程序dll路径配置及错误分析
- VS或VC调用matlab程序
- VS或VC调用matlab程序
- VS或VC调用matlab程序
- VC调用matlab7.10的接口程序实例
- VC++通过COM调用Matlab程序
- VC中外部程序的调用
- 关于VC调用Matlab的问题
- vc调用matlab函数
- VC6调用matlab7里的m程序的案例及方法
- VC 调用外部程序
- VC++的程序调用汇编的子程序
- VC++调用其它程序2
- VC中调用外部程序
- vc入门宝典十二(调用其它程序)
- VC++中使用MATLAB的C++数学库和MCC生成的程序(转)
- VC中调用Matlab引擎的设置
- 在VC中调用默认的电子邮件程序发送邮件
- 关于vc程序调用数据库问题
- 关于使用vc++调用matlab生成的dll传递数组的问题