C++调用matlab函数

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函数。

时间: 2024-10-05 19:48:17

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

java调用matlab函数接口的两种方案

Java 调用matlab 函数接口 Java调用matlab函数接口有两种方式: l 一种是通过matlab把函数打成jar包: l 一种是把matlab编译成dll后,用C++再封装成java能支持的数据类型的dll. 注意:不论用这两种方式中的哪一种,最终部署时都需要matlab环境(MCR,在matlab安装路径下有). 1. 方式一:matlab直接打jar包 1.1. 利用matlab自带工具打jar包 1.1.1. 建立jar包 在matlab的Commond Window中输入d

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

1.安装MatlabBridge插件 (1)在工具栏找到Extension,点击进入Extension Manager (2)找到MatlabBridge,安装 2.配置MATLAB环境 (1)在模块处找到Developer Tools——Matlab——Matlab Modules Generator (2)在Matlab executable处配置matlab.exe的路径(请确保计算机上安装有matlab,并且可以找到matlab.exe文件的位置):Matlab script direc

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

最近需要用到C++和Matlab的混编,记录一下学习过程~ 要实现的是调用Matlab函数,求矩阵前k个最小的特征值及其特征向量. //C++ #include "engine.h" //使用Matlab引擎需要包含的头文件#include <iostream>using namespace std;int main(){ Engine *m_engine; //创建Matlab引擎 m_engine = NULL; //初始化引擎 if((!m_engine &&

java调用matlab函数

如何将实验结果在matlab中可视化呢,下面使用java语言编程,调用matlab中的函数: 本人安装的是Matlab7.11.0 (R2010a)和 Eclipse 4.2 : 1)首先设置环境变量,运行tomcat,Eclipse等都需要依靠环境变量JAVA_HOME,Path,classpath,具体的设置可以参考这里 为了使在matlab中将.m函数编译为jar包,还需要在classpath中添加: %matlabInstallRoot%\R2010a\toolbox\javabuild

WPF调用Matlab函数方法

有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调用Matlab代码,就用到了Matlab生成.DLL文件的功能. 注:我的VS版本是2013,Matlab版本是2012a,两个软件不算新也不算老,应该是现在普遍用的版本 首先,生成Matlab的.DLL文件 在matlab的左下角选择start-matlab-NE-deploytool,或者直接在

Windows、Linux、Web安装及调用Matlab程序完整说明(大章)

本文档详细说明了Linux下Web项目调用Matlab函数的完整操作,文章适合对Java.Linux有一定基础了解的人群(不了解也没什么,无非是多试几次).因Linux作为服务器,所以未在其上安装Matlab主程序,只安装了运行环境MCR. 本文档内所述的所有版本软件均以32位为准,JDK与MCR也使用32位.若你的系统为64位,Linux系统同样为64位,则请尽量选择使用64位版本的JDK与MCR. 由于Matlab的版本限制问题,请保证Matlab主程序和MATLABCompiler Run

安装及调用Matlab程序可能存在的问题解决办法

无法执行本地调用Matlab函数JAR包,容易出现的问题 a检查你的环境变量Path: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; F:\Program Files\MATLAB\MATLAB Compiler Runtime\v717\runtime\win32; F:\Program Files\MATLAB\R2012a\runtime\win32;F:\ProgramFiles\MATLAB\R2012a\bin; 这是2个程序,需要都配置环境变量. b M

【转】C++调用Matlab的.m文件

原文地址 Matlab是一个强大的数学计算/仿真工 具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matlab的 资源呢? 在这里我简要的以一个简单的例子来说明一下如果在VC中调用matlab中定义的.m文件.繁多的理论就不说了,简明扼要的说一个实例.相信大家看过之后 都会马上学会的 其中灰色底显示的部分是需要我们手工输入的部分. 步骤如下: ㈠当然是先建立matlab的m文件. 这里为了简单起见,我在matla

C/C++程序通过动态链接库调用MATLAB程序

C/C++程序通过动态链接库调用MATLAB程序 1 MATLAB编译器设置 需要设定对应的C++编译器才能编译.m文件生成可供C++调用的库文件. 在MATLAB命令行输入:mex –setup:然后继续输入:mbuild –setup,选择已安装的VC编译器. 2 将MATLAB程序编译成C/C++动态链接库 假设存在一个Add.m的文件需要编译成库文件: function C=Add(A,B) C=A+B; end 2.1 将MATLAB程序编译成C动态链接库 采用mcc编译选项: >>