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. rabbitmq 源码安装

    官网地址:rabbitmqhttp://www.rabbitmq.com/releases/rabbitmq-server/官网地址:erlanghttp://erlang.org/download/ ...

  2. Qt5.8 在windows下mingw静态编译

    官方对编译一些条件介绍:https://doc.qt.io/qt-5/windows-requirements.html 在默认情况下,用QtCreator编译程序时,使用的是动态编译.编译好的程序在 ...

  3. FreeSWITCH与PSTN对接

    FreeSWITCH与PSTN电话系统对接设定 一.环境介绍 我们目前使用模拟的话机连接到电信运营商,购买他们配套的电话总机,勉强实现了公司的基本通话.但是客户电话总机系统以及升级添加新的应用不但费用 ...

  4. 【ES】学习4-结构化搜索

    1. 结构化搜索得到的结果只有是和否,没有相似概念. term可以实现精确值查询 curl -XGET 'localhost:9200/logstash-cowrie/_search?pretty' ...

  5. java :: Java中的双冒号操作符

    java中的双冒号操作符 定义 双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion. 通常的情况下: 把 x -& ...

  6. Java 清理和垃圾回收

    java.lang.ref.cleaner包 finalize()//该方法已过时,有风险,慎用 1.对象不可能被垃圾回收 2.垃圾回收并不等于"析构" 只有当垃圾回收发生时fin ...

  7. (七)CXF添加拦截器

    今天开始讲下拦截器,前面大家学过servlet,struts2 都有拦截器概念,主要作用是做一些权限过滤,编码处理等: webservice也可以加上拦截器,我们可以给webservice请求加权限判 ...

  8. mysql中delete from in子查询删除失败

    遇到一个情况,想通过表1的id找到表2,删除表2中barcode关联的库存数据,然后一直不能失败,如下: delete from 库存表 where BARCODE in( select BARCOD ...

  9. 通过生成支付二维码来实现微信支付的解决方案 - EasyWechat版(转)

    上一篇我们讲了在微信浏览器内实现微信支付的功能,它特别适合于一些基于微信公众号的h5站点等,支付流程也相当流畅,但是... 还有一种情况,比如现在北哥兄弟连PC版,是生成了一个二维码,这个二维码是专属 ...

  10. POJ 1862 Stripies 【优先队列】

    题意:科学家发现一种奇怪的东西,他们有重量weight,如果他们碰在一起,总重变成2*sqrt(m1*m2).要求出最终的重量的最小值. 思路:每次选取质量m最大的两个stripy进行碰撞结合,能够得 ...