2015.01.10 C++调用Matlab 实例
C++调用Matlab 实例 : C++调用mcc编译生成的DLL
步骤:
Step 1:编写matlab 函数
Step 2:使用mcc根据需求编译为DLL文件(C和C++环境下结果不同)
Step 3:配置VS的环境:文件目录、库目录、库名
Step 4:编写C++程序调用DLL
注意:
(i) Matlab 的平台和VS的平台要一致,VS在32位平台下无法调用64位的matlab编出来的DLL。会出现Link Error: unsoved function,也就是说VS在32位平台下无法识别64为的导入库(.lib文件)。
(ii) Matlab 函数中画图后要使用Drawnow 命令立即画图,否则C++调用时将不会显示
(iii)Matlab按列存储,index从1开始;C++按行存储,index从0开始
Example:
--------------------------------------------
Step 1: Matlab file: myadd.m
-----------------------------------------------
function c = myadd(a,b)
c = a + b ;
x = 1 : 0.1 : 10 ;
y = sin(x) ;
plot(x,y,'r-') ;
axis([0,11,-1,1]);
drawnow ;
---------------------------------------------
Step 2: mcc compiler
----------------------------------------------
mcc -W cpplib:myadd -T link:lib myadd.m
生成文件:myadd.h, myadd.cpp, myadd.dll, myadd.lib
------------------------------------------------
Step3: 配置VS编译器环境
------------------------------------------------
动态库路径:添加matlab DLL 路径与系统环境变量path ; 将myadd.dll放在当前目录或者环境变量path中
VC++包含目录:(i)maltab include 目录:***\extern\include ; (ii)生成myadd.h头文件目录
VC++库目录:(i)matlab lib目录:***\extern\lib\win64\microsoft ; (ii) 生成的myadd.lib目录
链接输入:libmat.lib, libmx.lib等
注: 编译和链接只需要.lib和.h文件可以搜到即可,运行需要指明dll路径。
------------------------------------------------
Step4: C++ file : main.cpp
------------------------------------------------
#include "mex.h"
#include "myadd.h"
int main (void)
{
const int N =
3 ;
double cVal_1 [N]
= {1,2,3};
double cVal_2 [N]=
{4,5,6} ;
double cVal_3 [N]
;
// initialization
myaddInitialize();
// convert information to the form of mxArray
mxArray * h1 = mxCreateDoubleMatrix(3,1, mxREAL)
;
mxArray * h2 = mxCreateDoubleMatrix(3,1, mxREAL)
;
double* ptr1 = mxGetPr( h1)
;
double* ptr2 = mxGetPr( h2)
;
for (int i =
0 ; i < N ; i ++)
{
* ptr1 = cVal_1 [i]
; ptr1 ++ ; % 使用指针进行数据交换操作
* ptr2 = cVal_2 [i]
; ptr2 ++ ;
}
mxArray* plhs [1]
;
mxArray* prhs [2]
;
prhs[0]
= h1 ; prhs[1]
= h2 ;
// call the fucntion
int nhls =
1 ;
int nrhs =
2 ;
mlxMyadd(nhls ,plhs, nrhs,prhs )
;
// extract information from the result saved in mxArray
double *ptr3 = mxGetPr( plhs[0])
;
memcpy(cVal_3 ,ptr3, N * sizeof (double))
;
myaddTerminate();
return 0
;
}
-------------------------------------------------------------------
C++调用Matlab函数结果:
cVal_3 = {5,7,9}。