VS2008与Matlab混合编程

    近日,需要用到matlab的CLAHE(对比度受限的局部直方图均衡化算法),由于水平跟时间有限,没有重写,网上找了一个CLAHE的CPP代码,很多错误,多次修改后仍与理想结果有差距,遂决定尝试在VS2008中调用由MATLAB生成的DLL进行运算。VC与MATLAB的混合编程方法有3种,由于仅接触DLL调用这种,所以下面的文章将讲述该方法。(该例子我测试过可用,中间出现了些小问题,已经标注)

    首先需要装好MATLAB,我的版本是2011a,运用安装文件自带的license.dat进行注册后,使用editor打开或者创建你所需要的.m文件,在此以网上盛传的mrank为例子。

    在m文件中实现如下功能:
获得N个魔方矩阵的秩。m文件的内容如下:
function r = mrank(n)

r = zeros(n,1);
for k=1:n
    r(k) = rank(magic(k));
end

将上述内容保存为:mrank.m

在matlab的command 窗口键入:
>> mcc -B csharedlib:mrank mrank.m %该命令将在后面做说明

执行上述命令后在bin目录下会生成下面几个文件:
mrank.exp    mrank.exports   mrank.h   mrank.lib  mrank.c     mrank.dll  

此时可新建一工程,将.c .h. lib .dll的文件拷贝至工程目录下。

 

接下来是配置VS:
首先配置vs2008的环境
1.工具——> 选项——>项目和解决方案——>VC++目录
(1) 选择“可执行文件”下拉框,添加:C:\Program Files\MATLAB\R2010b\bin\win32(注意:当前的Mathlab安装在C:\Program Files下面)
(2)选择“包含文件”下拉框,添加:C:\Program Files\MATLAB\R2010b\extern\include
(3)选择“引用文件”下拉框,添加:C:\Program Files\MATLAB\R2010b\extern\lib
(4)选择“库文件”下拉框,添加:C:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft
上述环境只需要配置一次

对于每一个工程,做下面的设置
项目——>属性——>连接器——>输入
选择:附加依赖项:添加:
libmex.lib
libmx.lib
libmat.lib
mclmcrrt.lib

 

此时将.c 文件改成.cpp文件,不然编译将失败,然后

然后在.cpp文件中加入

#include "stdafx.h"                           // 此行可酌情去掉
#include
#include"matrix.h"
#include"mrank.h"
#include "mclmcrrt.h"
#pragma comment(lib,"mrank.lib")

int main()
{
  mxArray *N(NULL),*R(NULL);
 int n =12;

 mrankInitialize();//初始化动态链接库
 N = mxCreateDoubleScalar(n);//用n来初始化生成的数组,其实标量就是一个1*1的数组
 mlfMrank(1,&R,N);//执行m文件的主要功能
 
 size_t num = mxGetM(R);//R的行的个数
 double *res = new double[num];
 memset(res,0,sizeof(double)*num);

 memcpy(res,mxGetPr(R),sizeof(double)*num);

 for(int i=0;i   printf("%f\n",res[i]);

 delete[] res;
 mxDestroyArray(N);
 mxDestroyArray(R);
 
 mrankTerminate();//终止动态数据连接
return 0;
}

 

即完成了对dll的调用。

注:使用VA有时变量类型下会有红色的下划线,此时只要确保你上述配置没有写错,重新启动VS即可解决问题。





 

 

   

你可能感兴趣的:(C++)