Matlab 和C++混合编程(续)实例

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}。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值