我是靠谱客的博主 受伤向日葵,最近开发中收集的这篇文章主要介绍C++ Matlab混合编程-----一、安装1 安装2 编辑.c文件3 matlab调用.c文件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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文件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部