概述
C++ Matlab混合编程-----一、安装
- 1 安装
- 2 编辑.c文件
- 2.1 新建vs项目
- 2.2 编写.c文件
- 3 matlab调用.c文件
matlab中矩阵预算特别方便,但如果有无法避免的循环甚至多层嵌套的话,会非常影响程序的效率,因此通常会将这种需要大量循环的模块用c++编写然后在matlab中调用。matlab中的的c++编程称为mex编程(matlab executive),其中需要些一个c++文件,然后在matlab中用mex命令编译它,然后就可以在matlab中像调用函数一样调用c++代码了。
1 安装
首先验证matlab能否与vs连接。在matlab下输入
mex -setup
如果显示
错误使用 mex
未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C++ 编译器;请参阅安装 MinGW-w64 编译器。有关更多选项,请访问 http://www.mathworks.com/support/compilers/R2016a/win64.html。
则,matlab没有安装合适的编译器。在 http://tdm-gcc.tdragon.net/download 下载 tdm64-gcc-5.1.0-2.exe ,双击 安装如下
点击create
我的电脑是64位。点击next
选择默认的安装地址,如果更改还要更改环境变量。方法如下链接
http://blog.sina.com.cn/s/blog_167bbdec10102x113.html
安装完成,在matlab命令行输入
setenv('MW_MINGW64_LOC','C:TDM-GCC-64')
mex -setup
结果如下:
MEX 配置为使用 'MinGW64 Compiler (C)' 以进行 C 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持
包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
您需要更新代码以利用
新的 API。您可以在以下网址找到相关详细信息:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。
要选择不同的语言,请从以下选项中选择一种命令:
mex -setup C++
mex -setup FORTRAN
选择C++
MEX 配置为使用 'MinGW64 Compiler (C++)' 以进行 C++ 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持
包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
您需要更新代码以利用
新的 API。您可以在以下网址找到相关详细信息:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。
c++编译器在matlab安装完成。
2 编辑.c文件
2.1 新建vs项目
打开vs2017,文件->新建->项目
新建项目之后,在源文件中添加c++文件
2.2 编写.c文件
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
}
-
必须添加include行的“”mex.h“”
如果mex.h文件无法识别,执行如下:工程右键->属性
在 C/C++下的附加包含目录下填入 E:appMATLABR2016aexterninclude。将mex.h识别出来
-
四个参数分别用来输出和输入数据: nlhs(left hand side) 是输出参数个数,plhs 是输出参数指针;nrhs (right hand side)是输入参数个数,prhs 是输入参数指针。(想象成一个赋值等式:a = b+c)b和c是需要输入的自变量位于右边
-
注意: 对输出和输入参数的操作都是通过指针的方式进行的。
操作输入数据
对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。 mxGetM 和 mxGetN 得到矩阵数据的行和列 (返回整数)。对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作。如:
double *M;
int m,n;
//指针指向第一个参数的数据地址
M = mxGetPr(prhs[0]);
m = mxGetM(prhs[0]);//获取行
n = mxGetN(prhs[0]);//获取列
对于输出数据,需要首先用专门的mex函数分配内存空间,如:**
plhs[0] = mxCreateDoubleMatrix(m,n, mxINT32_CLASS,mxREAL); //生成m x n 的实矩阵
同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量,如
double *A;
A = mxGetPr(plhs[0]);
后续详细讲解。
写好.c文件之后,使用matlab调用
3 matlab调用.c文件
调用.c文件,在matlab命令行输入
mex SplitBregmanROF.c
得到:
使用 'MinGW64 Compiler (C)' 编译。
MEX 已成功完成。
文件夹下生成编译好的文件: SplitBregmanROF.mexw64。写.m文件,在.m文件中使用
clean = SplitBregmanROF(noisy,.005,0.001);
执行成功,混合编程完成
最后
以上就是受伤向日葵为你收集整理的C++ Matlab混合编程-----一、安装1 安装2 编辑.c文件3 matlab调用.c文件的全部内容,希望文章能够帮你解决C++ Matlab混合编程-----一、安装1 安装2 编辑.c文件3 matlab调用.c文件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复