windows系统下C++调用matlab程序的方法详解

 更新时间:2017年08月27日 11:50:45   作者:MachineLP  
这篇文章主要给大家介绍了关于在windows系统下C++调用matlab程序的方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。

前言

之前已经跟大家介绍了在ubuntu系统下C++调用matlab程序的方法,需要的朋友们可以参考这篇文章,本文将给大家介绍关于windows下C++调用matlab程序的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

实验平台:

   matlab R2016b   VS2013

思路:

     1. 设置matlab的编译器,使用外部的VC或者gcc等编译器。

     2. 编译m文件成dll

     3. 设置VS的Include路径和lib链接库的路径

     4. 编写C++调用dll

步骤:

1.    设置matlab的编译器

在命令行窗口下,输入并执行如下命令:mex –setup

在出现的编译器中,选择VS2013

然后在输入命令:mbuild –setup 同样选择VS2013

2.    编写.m文件

如下函数时完成图像的分割功能,第一个参数是图像的文件名(路径),第二个参数是分割图像阈值的大小;完成分割后,将图像保存为result.bmp;返回值则是原图像的数据;

function imagedata=improcess(filename,threshold); 
imagedata=double(imread(filename)); 
newbuf=imagedata; 
[M N]=size(imagedata); 
for i=1:1:M 
 for j=1:1:N 
  if imagedata(i,j)>threshold 
   newbuf(i,j)=255; 
  else 
   newbuf(i,j)=0; 
  end 
 end 
end 
imwrite(uint8(newbuf),'result.bmp'); 
return; 

3.    编译.m文件

mcc -W cpplib:pr_lib -T link:lib improcess.m

解释:其中-W是控制编译之后的封装格式;

cpplib,是指编译成C++的lib;

cpplib冒号后面是指编译的库的名字;

-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字即是.m函数的名字。

编译完成之后,pr_lib.h pr_lib.libpr_lib.dll这三个文件时我们在c++中调用所需要的;这三个文件和我们用c++编写dll时,生成的三个文件时对应的;

VS中的调用步骤

1.    设置VC环境

将matlab的头文件路径和对应的库文件路径包含到VS;在VS中,点项目属性然后在‘VC++目录目录'选项卡中,将包含目录的最后一行,添加matlab相关的头文件;如我的matlab对应的路径为:

........\MATLAB\R2016b\extern\include

........\MATLAB\R2016b\extern\include\win64

将库目录,将matlab相关的静态链接库的路径加入其中:

........\MATLAB\R2016b\extern\lib\win32\microsoft

将链接器->输入:

libeng.lib
libmat.lib
libmex.lib
mclmcrrt.lib
pr_lib.lib

2.    新建一个基于控制台的hello World程序;

2.1    添加必须的头文件和必须的静态链接库

如果在上面的链接库中添加了lib, 下面只需要加入头文件就可以了。

#pragma comment(lib,"mclmcrrt.lib") 
#pragma comment(lib,"libmx.lib") 
#pragma comment(lib,"libmat.lib") 
#include "matrix.h" 
#include "stdafx.h" 
#include <iostream> 
#include "pr_lib.h" 

2.2    将matlab编译生成的pr_lib.h pr_lib.libpr_lib.dll文件拷贝到工程目录下;并将头问价和静态链接库添加到工程中:

#pragma comment(lib,"pr_lib.lib")
#include "pr_lib.h"

2.3    编辑main函数,调用improcess函数;

int main(int argc, char* argv[]) 
{ 
 //初始化, 在C++调用matlab时,必须要进行初始化。 
 if( !pr_libInitialize()) 
 { 
  printf("Could not initialize !"); 
  return -1;  
 } 
 char f_name[10]="lenna.pgm"; 
//必须将lenna.pgm图像,拷贝到工程目录下 
 mwArray file_name(f_name);//'lenna.pgm' 
 mwArray m_threshold(1,1, mxDOUBLE_CLASS); 
 m_threshold(1,1)=128;//阈值为128 
 mwArray ImageData(512,512, mxDOUBLE_CLASS); 
 improcess(1,ImageData,file_name,m_threshold); 
//1,表示返回值的个数,ImageData用于接收返回值 
 printf("\n图像处理结束,已经图像以阈值128分割开!\n"); 
 double *resultdata=new double[512*512]; 
 ImageData.GetData(resultdata,512*512); 
 printf("\n已获得图像数据...\n"); 
 for(int i=0;i<512;i++) 
 { 
  for(int j=0;j<512;j++) 
  { 
   printf("%0.1f ",resultdata[512*i+j]); 
  } 
  printf("\n"); 
 } 
 delete []resultdata; 
 // 后面是一些终止调用的程序 
 // terminate the lib  
 pr_libTerminate();   
 return 0; 
} 

解析:从上面的程序我们可以看出,c++与matlab函数数据传递是借助matlab定义的mwArray类完成的!该类支持的数据类型有:

/*typedef enum
 {
 mxUNKNOWN_CLASS = 0,
 mxCELL_CLASS,
 mxSTRUCT_CLASS,
 mxLOGICAL_CLASS,
 mxCHAR_CLASS,
 mxVOID_CLASS,
 mxDOUBLE_CLASS,
 mxSINGLE_CLASS,
 mxINT8_CLASS,
 mxUINT8_CLASS,
 mxINT16_CLASS,
 mxUINT16_CLASS,
 mxINT32_CLASS,
 mxUINT32_CLASS,
 mxINT64_CLASS,
 mxUINT64_CLASS,
 mxFUNCTION_CLASS,
 mxOPAQUE_CLASS,
  mxOBJECT_CLASS}*/

同时我们应注意:mwArray类定义的对象数组,其坐标仍然是从1开始,而不是像c++那样,从0开始!mwArray的更详细的用法,可以参看mclcomclass.h

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • VC++在TXT文件指定位置追加内容的方法

    VC++在TXT文件指定位置追加内容的方法

    这篇文章主要介绍了VC++在TXT文件指定位置追加内容的方法,功能较为实用,需要的朋友可以参考下
    2014-08-08
  • 详解C语言在STM32中的内存分配问题

    详解C语言在STM32中的内存分配问题

    这篇文章主要介绍了C语言在STM32中的内存分配,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C语言函数超详细讲解上篇

    C语言函数超详细讲解上篇

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数,函数我们分两篇来讲解,接下来开始第一篇
    2022-04-04
  • C++ 中RTTI的使用方法详解

    C++ 中RTTI的使用方法详解

    这篇文章主要介绍了C++ 中RTTI的使用方法详解的相关资料,希望通过本文大家能理解使用RTTI,需要的朋友可以参考下
    2017-09-09
  • Qt数据库应用之通用数据库同步

    Qt数据库应用之通用数据库同步

    数据库同步的主要功能是将本地的数据库记录同步到远程的数据库。本文将利用Qt实现通用数据库同步功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-03-03
  • C++链表节点的添加和删除介绍

    C++链表节点的添加和删除介绍

    大家好,本篇文章主要讲的是C++链表节点的添加和删除介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C++ 中

    C++ 中"emplace_back" 与 "push_back" 的区别

    这篇文章主要介绍了C++ 中"emplace_back" 与 "push_back" 的区别的相关资料,需要的朋友可以参考下
    2017-04-04
  • 基于C++输出指针自增(++)运算的示例分析

    基于C++输出指针自增(++)运算的示例分析

    本篇文章是对C++中输出指针自增(++)运算的示例进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Qt项目打包的实现步骤

    Qt项目打包的实现步骤

    本文主要介绍了Qt项目打包的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C++实现宿舍管理查询系统

    C++实现宿舍管理查询系统

    这篇文章主要为大家详细介绍了C++实现宿舍管理查询系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论