Matlab与C/C++混合编程

Visual Studio 2010

Matlab2014a 64bit

Windows7 64bit

以下是我安装的 Matlab2014a 支持的 C++混合编译器的SDK版本(为了上下版本兼容我选择VS2010)。


一、Matlab 示例代码

function [ a ] = add( x,y )
    a = x + y;
end

1.Matlab 先配置外部编译环境 (目的是通过外部编译器编译目标 [dll] 动态链接库)

mbuild -setup 选择VC++ 2010

mex -setup 选择VC++2010

2.使用 deploytool 可视化工具或使用命令mcc -W cpplib:add -T link:lib add将上述算法打包成dll动态链接库:

注明:使用 deploytool (在Matlab命令窗输入deploytool,选Library Compier 然后三步曲)会生成下列文件


注明:使用command(在Matlab命令窗输入 mcc -W cpplib:add -T link:lib add,在你当前的workspace输出结果;关于编译命令的详细说明,可以在命令窗键入: help mcc ,查看 -W 的相关解释)则会生成下列文件(项目只需要使用到上述deploytool讲到的三个lib文件)


二、Visual C++ 调用示例代码:


  1. 创建VC++项目,编写如下代码用于验证Matlab动态链接库算法是否调用成功。
#include <windows.h>
#include <iostream>
#include "add.h"
using namespace std;

int main(void)
{
    int a = 10;
    int b = 20;
    int out = 0;
    if(!addInitialize())
    {
        cout<<"Couldnot initialize lib:add()!"<<endl;
        exit(0);
    }
    mwArray mwA(1,1,mxINT32_CLASS);
    mwArray mwB(1,1,mxINT32_CLASS);
    mwArray mwC(1,1,mxINT32_CLASS);
    mwA.SetData(&a,1);
    mwB.SetData(&b,1);
    add(1,mwC,mwA,mwB);
    out = mwC.Get(1,1);
    cout<<"Ans = "<<out<<endl;
    system("pause");
    return 0;
}

三、配置Visual C++项目外部依赖项,配置入口

(由于64bit操作系统,VC运行环境也需要配置为x64,若是32位操作系统对应设定即可)


1.选中项目 – 右键 - [属性] - [配置属性] -[ VC++目录]

[包含目录]D:\Program Files\MATLAB\R2014a\extern\include

[库目录D:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft

2.选中项目 – 右键 - [属性] - [链接器] - [常规]

[附加库目录]D:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft

3.选中项目 – 右键 - [属性] - [链接器] – [输入]

[附加依赖项] 键入如下Lib:libeng.lib、libmat.lib、 libmex.lib、libmx.lib、mclmcrrt.lib、mclmcr.lib、add.lib

四、运行结果


以上例子虽然简单,但是这条路已经通了。对于Matlab这么庞大的算法资源随便做成动态库,为我所用(matla部分算法是不对外开放的)

以上内容是VC调用Matlab算法库的实现

-------------------------华丽的分割线-----------------------------------华丽的分割线--------------------------

增加部分: Matlab 调用 VC 动态链接库实现

意义 :脚本化控制 VC 实现的接口函数,释放工具开发人员(matlab脚本语言不需要编译)

应用场景 : 嵌入式类研发Debug 、调试、自动化验证平台等

一、VC

1、创建新项目:win32 ->DLL->(导出符号、空项目)


2、创建(功能实现接口)API文件:

创建以下三个文件及相应内容,并实现 mexFunction 函数。

注意:

1、这里创建的VC文件,将来就是Matlab的函数名,建议命名文件时以函数方式命名,这是matlab接口协议规定的:每个接口函数以文件名形式存在,所有文件里面创建同一个函数名 mexFunction 包括参数(这个 Function 类似 C 的 main 函数)。

2、vc_add.cpp、vc_add.h、vc_add.def 其中 vc_add.cpp 的 mexFunction 函数我有几句话补充一下 : nlhs、plhs[],是返回值参数,nrhs、prhs[] 是函数的形参,mxCreateDoubleMatrix 类似 C 的 malloc ,目的是为了给返回值创建一个1x1的矩阵,如果返回值是多个,那你就得按照实际情况创建, 它是 mxArray 数据类型。

【vc_add.cpp】

#include <iostream>
#include <string>
#include "vc_add.h"
#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
	double *a;
	double b, c;

	plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
	a = mxGetPr(plhs[0]);
	b = *(mxGetPr(prhs[0]));
	c = *(mxGetPr(prhs[1]));
	*a = b + c;
}

【vc_add.h】

#include "matrix.h"  
#include "mex.h"  

#define MEX_FUNCTION_API __declspec(dllexport)  

MEX_FUNCTION_API void mexFunction(int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[]);  

【vc_add.def】

LIBRARY
EXPORTS
	mexFunction

3、以下关于VC IDE的相关配置:

(我比较懒,就全部上截图了,从上到下依次配置)





4、生成解决方案

build完生成如下四个档案,我们只需要用到vc_add.mexw64

5、将vc_add.mexw64 copy 到 Matlab Workspace(里面有我另外一个函数,以后每增加一个函数就必须以文件的形式增加进来)


6、matlab的调用

这个时候Matlab 可以将刚刚实现的API 接口当內建函数直接使用了。


以上内容是Matlab调用VC++动态链接库的实现部分

-------------------------华丽的分割线-----------------------------------华丽的分割线--------------------------

增加部分: VC++与Matlab引擎实现混编

应用场景 : Win32/Win64直接使用Matlab的强大数学建模或绘图

一、环境配置

1、Matlab workspace的设置,(若不设置)默认路径在Matlab的安装目录


二、1、Matlab引擎外部调用需在系统环境变量 Path 增加

D:\Program Files\MATLAB\R2014a\bin\win64 (否则有可能提示缺失某些Matlab dll)

三、Visual studio C++编译环境配置


四、代码实现-(示例)

Matlab:(自定义加法程序) 实现之后将Mat函数文件保存在你设定的Workspace根目录

function [ r ] = m_add( a,b )
    r = a + b;
end

Visual C++:

#include "stdafx.h"
#include <windows.h>
#include "engine.h" //包含引擎
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    Engine *ep;
    int nStatus = 0;
    mxArray *result = mxCreateDoubleMatrix(1,1,mxREAL); // malloc memery
    double arResData[1][1];

if(!(ep = engOpen(NULL)))
{
    cout<<"Can't start Matlab Engine"<<endl;
    exit(1);
}

nStatus = engSetVisible(ep, false); // 隐藏matlab引擎启动的win com窗口
nStatus = engEvalString(ep, "result = m_add(1, 8)");//通过matlab引擎计算1+8的和
result = engGetVariable(ep,"result");// 获取Matlab引擎执行的返回值
memcpy((void*)arResData,(void*)mxGetPr(result),sizeof(arResData));//返回值转存
mxDestroyArray(result); // Destroy mxArray
cout<<"sum is "<<arResData[0][0]<<endl;
engClose(ep); // free ep
system("pause");

return 0;

}

五、运行结果


附1: Matlab 官方为不同编程语言提供的API接口列表

MATLAB API for Other Languages

附2:不同的Matlab版本对操作系统的支持要求及混合编译器版本要求

Support - System Requirements and Supported Compilers Previous Releases - MATLAB & Simulink

附3 : 目标终端机器上运行混编的可执行程序需要有MCR环境,官方对应不同版本有不同的MCR

MATLAB Runtime - MATLAB Compiler - MATLAB

附4: download

链接:pan.baidu.com/s/1skWNe9 密码:h3ao

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值