算法库:Matlab与C++混合编程
算法库: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++混合编程的更多相关文章
- [转] Matlab与C++混合编程,添加OpenCV库
原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...
- Matlab与C++混合编程,添加OpenCV库
最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...
- matlab与vs混合编程/matlab移植
前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- Matlab与C++混合编程(依赖OpenCV)
Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...
- matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)
matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...
- [转] Matlab与C++混合编程(依赖OpenCV)
作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...
- Matlab与C++混合编程 1--在C++中调用自己写的matlab函数
在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...
- 【目录】Matlab和C#混合编程文章目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...
随机推荐
- BNUOJ 1006 Primary Arithmetic
Primary Arithmetic 来源:BNUOJ 1006http://www.bnuoj.com/v3/problem_show.php?pid=1006 当你在小学学习算数的时候,老师会教你 ...
- java 实现mysql数据库导出
package com.zbb.util; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStre ...
- 在数据库查询时解决大量in 关键字的方法
有时候在前台界面需要批量处理一些数据时,经常要用到update table set fields=value where keyid in ('1','2',....) 但如果这个数据量如果超过100 ...
- javascript 对象中的 handleEvent
在高级浏览器中,我们在绑定事件的时候 可以知道绑定一个对象,然后在这个对象中的 handleEvent 方法会自动进入指定的方法,不多说了举个例子吧!! var events = { handleEv ...
- 会话控制:SESSION,COOKIE
1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...
- JQUERY 拖拽 draggable droppable resizable selectable sortable
今天用了jq ui的拖动碰撞功能,好不容易看到有详细的API解说,记录如下: <script language="JavaScript" type="text/ ...
- LintCode "Delete Digits"
Greedy: remove earliest down-edge: like "54", "97". class Solution { public: /** ...
- Linux命令之at
1.命令格式:at[参数][时间]2.命令功能:在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程(ps -ef | grep atd查看, 开启用/etc/init.d/atd s ...
- docker的例子
定制镜像 做个测试服务器,testServer代码如下 package main import ( "net/http" ) func main() { http.Handle(& ...
- SQL Server 中LEN函数的问题
LEN('T ') =1 LEN(' T') =2 在数据库中分解字符串时要注意,例如以'^'分隔'X ^ T ',分解时要注意最后的'T '被分解成'T' 可用如下的代码来进行完整的分解 SET A ...