关于c++调用matlab编程的经验总结

       matlab具有十分强大的数学处理能力,里面包含了很多的库,因此最近想在c++的基础上调用matlab处理一些数学式子,在看了很多的博客的基础上,也遇到了蛮多的问题,现在总结整理一下,以后当复习用。

       先讲方法,后讲中间遇到的问题。

一、软件版本

       matlabR2017b+vs2015,win10

二、具体步骤

关于matlab

1、matlab中写好函数m文件;

2、命令行输入(3条命令):mex -setup        mbuild -setup            mcc -W cpplib:Add  -T link:lib Add.m

        两次命令分别选择c++编译器即可,生成不同的文件,主要需要的是动态库文件(dll)、静态库文件(lib)和头文件(h),将这三个文件复制到下面创建的vs平台项目中去(头文件)

关于vs2015(记得转换成64位平台属性,即x64)

1、新建一个项目,点击“项目”->“项目属性”->“vc++目录”

       选择“包含目录”,点击“编辑”,在最上面添加文件,将matlab文件添加进去,主要是三个文件,看个人的安装目录即可,分别为:\extern\include\win64和\extern\include,再加上自己通过编译的m文件所在的根目录(这个没试过是否可以删掉)

2、选择“库目录",这里主要是添加matlab库文件

       分别为:\bin\win64和\extern\lib\win64\microsoft,我把通过编译的m文件所在的目录也加上了

3、点击”链接器“->”输入“

       在”附加依赖项“中添加如下所需要的静态库文件:libeng.lib
       libmat.lib
       libmex.lib
       libmx.lib
       mclmcrrt.lib
      mclmcr.lib
      Add.lib(这里是自己通过m文件编译出来的,Add是自己设的文件名)

综上,属性栏基本设置完成

下面放入我自己用的测试代码(也是从别的博主那里参考的)

#include "stdafx.h"
#include <iostream>
#include <engine.h>
#include "Add.h"
using namespace std;

int main()
{

    cout << 1 << endl;

  //方式1,直接调用
    if (!AddInitialize())
        return -1;
    int a = 10, b = 20;
    int c;
    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);
    c = mwC.Get(1, 1);
    cout << "c=" << c << endl;
    AddTerminate();

    //方式2,通过Engine调用

    /*Engine *ep;
    ep = engOpen(NULL);
    engEvalString(ep, "x=0:0.05:2*pi;y=sin(x);plot(x,y,'.b')");
*/

    cout << 1 << endl;
    return 0;
}

代码解释:

       (1)前面加上两个”cout<<1<<endl;"是因为刚开始的时候发现只有前面的1输出,后面的1不输出,中间被调用matlab的代码截断了;

       (2)上面的方式1,是通过mwArray进行的,代码了matlab中最基本的矩阵操作,是一个类;这种方式需要注意了,必须“加头加尾”,即: if (!AddInitialize())  return -1;和  AddTerminate();这两个函数,“Add”表示了自己通过matlab编译的文件名。不然会出现截断,后面的“cout”边无法进行了。因为这里是同通过mwArray调用,则需要告诉编译器,调用从哪开始从哪结束,如果“无头无尾”,则会截断。

       (3)Engine是通过调用matlab出来来处理的,比较麻烦一些,但是能通过绘图;

三、遇到的问题

       1、最开始是用的matlabr2014a+vs2015,发现mex -setup都通不过,后面发现2014版本的matlab文件没有对应的2015的xml文件,因此在网上下了一个,添加进入,可以了

       2、后面发现通过了mex -setup之后,mbuild -setup通不过,查了一下说的是破解不完全导致,就再破解了一次,不过没用原来的破解文件。

      3、上面两个文件我都放在了资源里面,还没有通过审核,但是能找到下载的。但是注意了,是对应的matlabr2014a和vs2015。

      4、后面都通过了,发现编译的时候一直提示“由于找不到*****dll,无法继续执行代码。重新安装程序可能会解决此问题”,网上有说直接把这个动态库文件添加到对应的exe目录下即可,如果所有添加,确实可以,但是matlab这个库有1个多G。。。。不现实。琢磨下来,明明都添加在工程属性里面了,怎么会没有。

      后面在matlab里面找到了这个dll文件所在的目录(我的是在***\matlab2017b\bin\win64),并将目录添加到了系统的环境变量中去,即PATH,后面发现就可以了!!这个是最大的问题了。PATH在系统的高级系统设置里面就可以找到了

      通过上面几个问题的解决,就解决了两种方式所出现的问题了。done

      希望我的经验能对大家有所帮助!

发布了1 篇原创文章 · 获赞 0 · 访问量 13

猜你喜欢

转载自blog.csdn.net/YWX818/article/details/105093828