C++与matlab混合编程——C++调用MATLAB函数

笔者最近在从事一个MFC相关的项目,要求将用Matlab实现的算法通过应用MFC制作成一个小应用。其中有一部分内容需要求一个多元函数的最值。通过网络,我找到了两个C++优化库,dlib与MIDACO_Project ,可是这两个库中的优化函数的应用方式无法融入MFC编程框架,因此想到应用matlab与C++混合编程来实现相关计算。在网络上查了很多资料使问题得到了解决,下面对之前所查资料的内容做一番总结。

一、编译matlab函数

在matlab命令行输入窗口中输入“mex -setup”命令,打开对mex的配置选项,根据自己电脑上的配置,会显示出matlab自带的lcc-win32编译器和其它C编译器。我电脑是32位的,matlab版本为R2014a,C编译器为Visual studio2013的编译器。如下图所示,已经显示了我电脑上的两种编译器,在此可用鼠标点击选择“Microsoft Visual C++ 2013 Professional (c)”选项,有的版本的matlab会提示在命令行中输入字符来进行选择。有两种情况是matlab中无法显示其它的编译器选项:1、如果matlab先于visual studio安装的话,输入“mex -setup”命令,matlab里面会没法显示visual studio编译器,很简单的解决方法就是重新装一次visual studio保证其在matlab之后安装到电脑上;2、当前matlab版本无法支持电脑上的编译器,比如:matlab2014版本的就无法支持VS2015。在这个网站上有各个版本的matlab对编译器的支持情况,根据网站内的说明来下载对应的编译器。

接下来就要在matlab中创建需要被编译的函数了,很多网站内的例子都是一些很简单的函数,比如:两个数的求和,害得我一度认为只能够将一些较为简单的函数进行编译。我所写的函数如下图所示,其中的内容较为复杂,应用到了matlab中的@关键字来获取函数,并且在objrmse函数中还调用了很多其它的函数,将这个函数所调用的所有m文件放到当前目录下。

在命令行输入窗口中输入“mcc -W cpplib:WPCtriForTwo  -T link:lib WPCtriForTwo.m”,其中前一个WPCtriForTwo是生成的库名,可以自己指定,WPCtriForTwo.m为需要被编译的,matlab函数文件。稍等一会,就可以完成对函数的编译,并且在当前目录中生成很多编译后的文件,需要用到的文件有三个:后缀名分别为:WPCtriForTwo.h,WPCtriForTwo.dll,WPCtriForTwo.lib。将这三个文件复制到项目中来,其中后缀名为dll的文件要放入MFC项目的debug目录中,后缀名为h的文件需要添加到项目中去,通过右击项目选择“添加”->“现有项”,从文件管理器中选择该文件放入项目中。由于在项目中会应用到很多从matlab编译过来的函数,我项目中建立一个文件夹matlabFunctionLib来放置编译生成的lib文件,并且将WPCtriForTwo.lib文件放进去。

二、配置MFC项目

将matlab程序编译为C++程序后,还需要很多matlab所提供的C++库的支持,这些库及其相应的头文件都放在了MATLBA的安装目录下的extern目录中。考虑到并不是每台电脑上都安装有matlab,因此我选择将这些内容复制到MFC项目中,通过相对路径的方式对这些内容进行引用。将“matlab安装目录/extern”目录中的include目录和lib目录一并复制到MFC项目中,如图内红框所示。

接下来设置项目对上述内容(包括通过编译生成的和从matlab中复制过来的)的引用。

右击打开项目的属性窗口,选中VC++目录选项,我们需要修改其中的包含目录和库目录两部分的内容,如下图所示。在"包含目录"中应用相对路径语法(注意:在VS中相对的是后缀名为vcxproj文件的路径)添加之前从matlab中复制加入的include目录,即添加一条“../include”信息。在"库目录"中添加之前从matlab中复制过来的lib目录中的相关库文件的目录,由于所设置的MFC项目为32位的,所以需要添加包含32位库的目录,因此编辑添加“..lib\win32\microsoft”。

  选中“链接器”->“常规”->"附加库目录",在其中添加matlabFunctionLib目录的相对位置,这样项目编译时就可以找到所matlab函数编译所生成的库文件。

  最后,在“链接器”->“输入”->"附加依赖项"中,输入如下内容:

mclmcrrt.lib
libmx.lib
libmat.lib
libeng.lib
WPCtriForTwo.lib

  其中WPCtriForTwo.lib为编译生成的lib文件,其余的几个为matlab中所带的lib文件。这样就完成了混合编程的VS配置工作。

三、C++对所编译的matlab函数进行调用

  在需要调用函数的文件中添加包含,对于我的项目就是#include “WPCtriForTwo.h”。可以参考这一篇博客中的例子来学习如何调用matlab函数。

C++调用matlab函数的更多相关文章

  1. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”.而在实 ...

  2. C/C++下调用matlab函数操作说明

    1.matlab的安装 连接:http://pan.baidu.com/s/1qXuF7aO 安装32位版本的matlab(在目录下bin文件夹中有两个文件夹,选择win32文件夹下的setup进行安 ...

  3. 3D Slicer中文教程(六)—调用matlab函数(MatlabBridge使用方法)

    1.安装MatlabBridge插件 (1)在工具栏找到Extension,点击进入Extension Manager (2)找到MatlabBridge,安装 2.配置MATLAB环境 (1)在模块 ...

  4. C++调用Matlab函数求特征值

    最近需要用到C++和Matlab的混编,记录一下学习过程~ 要实现的是调用Matlab函数,求矩阵前k个最小的特征值及其特征向量. //C++ #include "engine.h" ...

  5. Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项

    问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...

  6. WPF调用Matlab函数方法

    有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调 ...

  7. java调用matlab函数

    如何将实验结果在matlab中可视化呢,下面使用java语言编程,调用matlab中的函数: 本人安装的是Matlab7.11.0 (R2010a)和 Eclipse 4.2 : 1)首先设置环境变量 ...

  8. 【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)

    最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上 ...

  9. 使用Java程序调用MatLab

    Java代码实现的计算难免会显得不够高效.而利用MATLAB写好相应的计算函数,然后打包成jar包供Java调用,在某些情况下会更加方便.或者有些时候会涉及到使用Java调用MatLab展现一些二维三 ...

随机推荐

  1. PYTHON-模块定义 搜索路径

    模块是什么: ***** 模块 是一系列功能的集合体 一个py文件就是一个模块 一个函数就是一个功能 例如 A.py 文件名A.py 模块名 A 模块有哪些来源 内置 第三方 自定义 模块有四种通用的 ...

  2. Android 项目中文件夹作用(res文件夹详细介绍)

    1. src:存放所有的*.Java源程序. 2. gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3. assets:可以存放项目一些较大的资源文件,例如: ...

  3. 类(字符串型;日期时间型;Math)

  4. Office系列版本安装包下载

    链接:http://pan.baidu.com/s/1i4UFZOp  密码:f9y8 链接:http://pan.baidu.com/s/1i4YJN4D 密码:743q 链接:http://pan ...

  5. js之观察者模式

    观察者模式: 大体上是, 1.松耦合的代码: 2.一对多的关系: 3.主体状态变化时,所有依赖被通知: 4.主体和观察者互不知晓. 基本上,满足上面四点的,就可以算是观察者模式了.来看一个demo, ...

  6. [转]清理ambari安装的hadoop集群

    本文针对redhat或者centos 对于测试集群,如果通过ambari安装Hadoop集群后,想重新再来一次的话,需要清理集群. 对于安装了很多hadoop组件的话,这个工作很繁琐.接下来是我整理的 ...

  7. Luogu P4945 【最后的战役】

    本来以为做法一样,就是少带个$log$,结果发现看不懂出题人的题解(我好菜啊) 那就自己写一篇吧 比较简单的$DP$思路 状态定义: 前两个转移很好处理,第三个好像就不好办了 不妨暴力定义进状态里 设 ...

  8. Sony笔记本

    关机的情况下按键盘 f2键.进菜单选更改 bios设置 修改 3个地方 进bios右移 boot上 第一项 ufei改成 legacy external device改成enabled 下面启动顺序改 ...

  9. WebApi表头设置跨域

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { var setti ...

  10. java:大小写字母转换

    public class Solution { public static void main(String args[]) { testSolutions.lowercaseToUppercase( ...