利用VS2015实现C++与matlab混合编程:

鉴于Matlab对于一些科学运算以及数据分析等十分方便,又鉴于很多人习惯于编写C++代码,因此C++和matlab混合编程成为了我们的需求。   

 一种非常方便的方法是用C++调用matlab引擎,以直接调用matlab进行编程,具体步骤如下:

1) 安装matlab2016b,安装路径为D:\Program Files\MATLAB\R2016b

2) 在VS2015的属性页-VC++目录中配置项目包含目录

       D:\Program Files\MATLAB\R2016b\extern\include

3) 在VS2015的属性页-VC++目录中配置项目库目录

       D:\Program Files\MATLAB\R2016b\extern\lib\win64\microsoft

4) 在VS2015的属性页-链接器-输入-附加依赖项中添加

       libmat.lib;libeng.lib;libmx.lib;

5) 添加D:\Program Files\MATLAB\R2016b\bin\win64和D:\ProgramFiles\MATLAB\R2016b\bin\win32到path环境变量

6) 打开matlab2016b,在命令窗口中依次运行以下命令:

       mex -setup C++

       mbuild -setup

    (不要直接复制粘贴,否则可能会因字符编码问题而运行出错。)

6) 完成上述步骤后,我们就可以写C++代码了。调用matlab的库函数简介如下:

 

引擎函数

功能描述

engOpen

启动Matlab计算引擎

engGetArray

Matlab引擎获得一个Matlab矩阵,用于数据交换

engPutArray

从应用程序向Matlab引擎发送一个Matlab矩阵,用于数据交换

engEvalString

执行一Matlab命令,如engEvalString(ep, "plot(T,Y);");其中epEngine指针

engOutputBuffer

创建字符缓冲区,以获得Matlab文本输出

engOpenSingleUse

打开一个单独的非共享的Matlab计算引擎

engClose

关闭Matlab引擎

engSetVisible

设置Matlab引擎

engGetVisible

返回Matlab显示状体

engGetVariable

Matlab工作区(Workspace)获得一个变量

engPutVariable

将指定名称的Matlab变量存入Matlab工作区


例子:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"engine.h" // 添加matlab引擎库的头文件

// 导入相关lib库
#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")

int main()
{
    Engine *ep;
    // 启动引擎
    if (!(ep = engOpen("\0")))
    {
        fprintf(stderr, "\n打开Matlab引擎失败!\n");
        return EXIT_FAILURE;
    }
    // 执行:
    int Nsample = 50;
    const double PI = 3.1415926;
    double *t = new double[Nsample];
    for (int i = 0; i <Nsample; i++)
    {
        t[i] = i * 2 * PI / Nsample;
    }
    mxArray *T = NULL, *result = NULL;
    T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
    memcpy((void *)mxGetPr(T), (void *)t, Nsample * sizeof(t[0]));
    // 把变量T存入Matlab工作区
    engPutVariable(ep, "X", T);
               
    // 执行Matlab命令   
    engEvalString(ep, "Y=cos(X);");
    engEvalString(ep, "plot(X,Y);");
    engEvalString(ep, "title('y=cos(x)');");
    engEvalString(ep, "xlabel('x');");
    engEvalString(ep, "ylabel('y');");
    fgetc(stdin);
    // 清除对象,不能漏!
    mxDestroyArray(T);
    engEvalString(ep, "close;");
    // 关闭引擎,不能漏!
    engClose(ep);
    return EXIT_SUCCESS;
}

 运行效果如下图:

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值