VS和matlab混合编程——调用matlab计算引擎

前段时间使用到了matlab,主要是用其中一个toolbox的函数,但是主开发环境还是定为了VS,于是学习了下如何进行混合编程,包括mex格式文件的编写和使用。
在过程中了解到了,除了引用matlab里的函数文件之外,还可以通过调用其引擎来完成工作量较少的内容,调用的方式为matlab自身带有的engine类型函数。
下面主要说下调用过程:
一、matlab和VS的版本:
这个网上都说必须使用相同版本号的两个软件,比如VS2013和matlab2013a(b),也有种说法是matlab的版本号对VS向下兼容,可能是基于mex文件的编写和使用。但是对于调用计算引擎来说,亲试VS2015可以正常调用matlab2014b。不知道其它情况,反正目前没发现有什么错误。

二、开发环境的配置:
首先要知道我们的目的是在VS下使用matlab计算引擎来辅助程序开发,所以主要的开发环境是VS,仅仅需要对VS作必要配置就好。
第一,在项目属性->VC++目录->包含目录中,添加路径:(matlab所在路径)\extern\include;
第二,在项目属性->VC++目录->库目录中,添加路径:(matlab所在路径)\extern\lib; 这里需要注意的是有些情况下需要再继续补充路径,我再第一次试验时用上面的路径没问题,第二次debug使用x64来调试时就出现了错误,如果有错误的话,就补充路径 :(matlab所在路径)\extern\lib\win64\microsoft;
VS和matlab混合编程——调用matlab计算引擎_第1张图片
第三,在项目属性->连接器->输入->附加依赖项里,添加三个库文件:
libeng.lib;libmx.lib;libmex.lib;
VS和matlab混合编程——调用matlab计算引擎_第2张图片
第四,这一步我在最开始的过程中并没有添加,导致编译中一直提示找不到库文件,最后查了很久才知道问题出在哪儿,原来不仅需要在VS下添加文件路径,还需要在系统的环境变量设置里添加库文件路径。
打开我的电脑->属性->高级设置->环境变量->path,添加路径($matlab所在路径)\bin\win64;
这里注意下,因为我目前用的matlab版本为2015b,系统为win10,所以环境基本都是64位的,比如在我使用matlab2014b的时候,bin目录下有win32和win64,主要取决于你的编译环境。
VS和matlab混合编程——调用matlab计算引擎_第3张图片
VS和matlab混合编程——调用matlab计算引擎_第4张图片
VS和matlab混合编程——调用matlab计算引擎_第5张图片

三、例程试验:
其实到第二步为止就已经算是配置完成了,下面提供给大家一个例程,看看能否编译出来,如果有错误,欢迎大家留言,一起交流

#include "stdafx.h"
#include <iostream>
#include "stdlib.h"
#include "string.h"
#include "engine.h" //这里就是matlab引擎调用相关函数的所在头文件,一定要添加上
#define PI 3.1415

#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"libmex.lib")  //这三个是链接库文件,其实有了之前的添加路径,这步可省

using namespace std;
int main()
{
    cout << "请耐心等待正在打开matlab\n";  //打开引擎  

    Engine* ep; //定义engine类型指针,往后函数都要用它来指示目标
    ep = engOpen(NULL); //启动函数,成功则返回一个非零值 
    if (ep == NULL) {
        cout << "Can't start MATLAB engine!";
        return 1;
    }

    cout << "let's draw four flowers:\n"; //这个程序是利用matlab计算引擎来完成四个函数的绘制
    engEvalString(ep, "z1=sym('(x^2+y^2)^(1/2)');"); //引号里为命令,这个函数的意思就是直接对ep指向的目标输出命令,相当于发送命令到matlab里的命令行控制台
    engEvalString(ep, "z=sin(z1);");
    engEvalString(ep, "subplot(2,2,1),ezsurf(z);");
    engEvalString(ep, "z=sin(z1)*cos(z1);");
    engEvalString(ep, "subplot(2,2,2),ezsurf(z);");
    engEvalString(ep, "z=sin(z1)/tan(z1);");
    engEvalString(ep, "subplot(2,2,3),ezsurf(z);");
    engEvalString(ep, "z=cos(z1);");
    engEvalString(ep, "subplot(2,2,4),ezsurf(z);");

    cout << "hit enter to close\n"; 
    fgetc(stdin);
    /*释放内存空间,关闭计算引擎*/
    engEvalString(ep, "close;");
    engClose(ep);
    return 0;
}

如果编译没问题的话,会出现一个matlab窗口如下:
VS和matlab混合编程——调用matlab计算引擎_第6张图片

你可能感兴趣的:(matlab)