算法库:Matlab与C++混合编程

最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程。在同事Matlab2014的环境下,程序到是一下就运行通过了。但在我这Matlab2010的环境下,就怎么也运行不通过。你说让我下载个Matlab2014安装吧,真不想。第一,安装包大。第二,安装占空间也大。第三,我的Matlab2010是绿色版的。习惯绿色版的盆友们,应该能理解我的感受吧。尤其是像这种大软件,放在U盘里,哪里都能办公,多爽。

Matlab与C++混合编程包括:在Matlab中调用C++和在C++中调用Matlab。

1 在Matlab中调用C++

1.1 设置编译器

要想在Matlab下编译.cpp或.c文件。首先,要设置编译器。编译器有很多种选择。我用VS2010。

在Matlab2010命令行模式下输入:

(1)输入:mex –setup

(2)选择:N

(3)选择:11。即[11] Microsoft Visual C++ 2010。

(4)选择:Y

于是就设置好编译器啦。

但是,Matlab2010默认没有VS2010,所以上面的第三个步骤没法进行。

这里需要下载一个文件“VS2010MEXSupport.zip”。百度一下,就能找到啦。

将压缩文件内VS2010MEXSupport.zip\bin\win32\mexopts的所有文件解压到MATLAB\bin\win32\mexopts下。这样,就可以将编译器设置为Microsoft Visual C++ 2010啦。如果你是64的Matlab就解压win64\mexopt下的文件。

1.2 编译C/C++文件。

用命令:mex xxx.cpp就能编译啦。编译之后会生成相应的xxx.mexw32或xxx.exw64文件。

编译时会出现以下问题:

~~~~error C2371: 'char16_t' : redefinition;~~~~~

打开MATLAB\extern\include\matrix.h并将以下代码注释掉:

#ifndef __STDC_UTF_16__
#    ifndef CHAR16_T
#        if defined(_WIN32) && defined(_MSC_VER)
#            define CHAR16_T wchar_t
#        else
#            define CHAR16_T UINT16_T
#        endif
         typedef CHAR16_T char16_t;
#    endif
#endif

然后在其后添加如下代码:

#ifndef __STDC_UTF_16__
#if !defined(_CHAR16T)
  #define _CHAR16T
typedef unsigned short char16_t;
typedef unsigned int char32_t;
 #endif /* !defined(_CHAR16T) */
 #endif

这段代码来源于:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\yvals.h

这样操作之后,就可编译成功啦。

1.3 cpp文件结构

一个C/C++的MEX源程序必须包括两部分:

(1)#include “mex.h”

(2)MEX文件入口函数mexFunction且参数形式也是固定不变的。如下:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{}

nlhs:输出参数数目

plhs:指向输出参数的指针

nrhs:输入参数数目

prhs:指向输入参数的指针

通过type in = mxGetType(prhs[i])得到输入参数。

通过phlhs[0]=….将结果传给输出参数。

对了,我的Matlab版本是Matlab2010a,Version7.10.0.499。网上下的,大小1.95GB(2101773727字节)。

时间紧迫,不多讲啦,就这样吧。

2 在C++中调用Matlab

2.1 配置VS2010的工程

与配置OpenCV过程相似。

(1)环境变量:

D:\MATLAB\R2010a\runtime\win32;

D:\MATLAB\R2010a\bin\win32;

(2)VC++目录-->包含目录:

D:\MATLAB\R2010a\extern\include

D:\MATLAB\R2010a\extern\include\win32

(3)VC++目录-->库目录:

D:\MATLAB\R2010a\extern\lib\win32\microsoft

(4)链接器-->输入:

在D:\Program Files\1.3MATLAB\extern\lib\win32\microsoft下除libmwservicesv.lib外的所有.lib文件,即:

libemlrt.lib

libeng.lib

libfixedpoint.lib

libmat.lib

libmex.lib

libmwblas.lib

libmwblascompat32.lib

libmwlapack.lib

libmwmathutil.lib

libmwsl_fileio.lib

libmwsl_solver_rtw.lib

libmx.lib

libut.lib

mclcommain.lib

mclmcr.lib

mclmcrrt.lib

mclxlmain.lib

ne_mli.lib

ne_rtl.lib

physmod_foundation_util.lib

rtwcg.lib

这样之后就可以调用Matlab2010a的引擎编程啦。

2.2 编译M文件

算法库:Matlab与C++混合编程的更多相关文章

  1. [转] Matlab与C++混合编程,添加OpenCV库

    原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...

  2. Matlab与C++混合编程,添加OpenCV库

    最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...

  3. matlab与vs混合编程/matlab移植

    前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

  4. Matlab与.NET混合编程解决人脸识别问题

    原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...

  5. Matlab与C++混合编程(依赖OpenCV)

    Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...

  6. matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)

    matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...

  7. [转] Matlab与C++混合编程(依赖OpenCV)

    作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...

  8. Matlab与C++混合编程 1--在C++中调用自己写的matlab函数

    在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...

  9. 【目录】Matlab和C#混合编程文章目录

    本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...

随机推荐

  1. Google Proposes to Enhance JSON with Jsonnet

    Google has open sourced Jsonnet, a configuration language that supersedes JSON and adds new features ...

  2. eclipse开发Android程序sdk和avd的图标不见了

    在eclipse中开发我们的Android程序时,安装sdk是必不可少的,有时候会出现sdk和avd的图标都不见了的情况,一般出现这种情况的原因是你从别处copy了一个sdk的包然后直接在引用造成的, ...

  3. java.lang.NoSuchMethodError: 属于jar包冲突

    今天测试接口,出错:java.lang.NoSuchMethodError: org.apache.http.entity.mime.content.StringBody.<init>(L ...

  4. 详解MySQL大表优化方案( 转)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  5. [算法] 数据结构之AVL树

    1 .基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级——它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋.下面我们来看看: 1.1  AVL树是什么? AVL树本质上还是一棵 ...

  6. isa class 帮助确定对象或变量的数据类型

    isa class 帮助确定对象或变量的数据类型

  7. 深入了解iPad上的MouseEvent【转】

    iPad上没有鼠标,所以手指在触发触摸事件(TouchEvent)的时候,系统也会产生出模拟的鼠标事件(MouseEvent).     这对于普通网页的浏览需求而言,基本可以做到与PC端浏览器无明显 ...

  8. Python基础教程【读书笔记】 - 2016/7/7

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第四波:第5章  条件.循环和其他语句 [总览]  深入介绍条件语句和循环语句,随后会看到列表推导式如何扮演循环和条件语 ...

  9. Window下Nexus私服搭建

    项目组大部分人员不能访问maven的central repository,因此在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上  环境是:nexus-2.1.1.mav ...

  10. php Xdebug调试

    php开发环境里,安装了xdebug模块后,var_dump()输出的结果将比较易于查看,但默认情况下,var_dump() 输出的结果将有所变化:过多的数组元素不再显示,字符串变量将只显示前N个字符 ...