vs2013调用matlab函数

来源:互联网 发布:氰化氢淘宝有卖吗 编辑:程序博客网 时间:2024/06/05 04:28

法一(常用方法):使用engine。
1、添加matlab环境:
在vs2013中vc-directory中添加matlab的excutable 、include、library的directory
Include:
E:\matlab2014\extern\include
Library:
E:\matlab2014\extern\lib\win64\microsoft

然后再linker的input中添加依赖项:
mclmcr.lib
mclmcrrt.lib
mclbase.lib
mclcommain.lib
libmex.lib
libmx.lib
libmat.lib
libeng.lib

然后再在系统环境变量中添加:
E:\matlab2014\bin\win64

ps:注意选择平台,是64位还是32位要对应,不然报错。

2、然后使用

    Engine *ep;    if(!(ep = engOpen("")))    {        cout << "ERROR";    }

打开engine,下面主要介绍如何将参数传进去(主要是c++中的类):
mxCreateStructMatrix函数:

mxArray *mxCreateStructMatrix(mwSize m, mwSize n, int nfields,          const char **fieldnames);

m为要建立的结构体的个数,n为结构体的每个成员变量的数组数(这个一般就是1!!!若是2则会出现现params.xxx有2个cell),nfields为成员变量的个数,fieldnames为成员变量名):

mxSetField()函数:

void mxSetField(mxArray *array_ptr, int index,   const char *field_name, mxArray *value);

array_ptr为struct指针,index为数组索引,即上面说的那个n,在create的时候如果设置为1表示此成员在此struct里面就一个,故set的时候index = 0(c++从0开始索引).

    const char* fields[] = { "padding", "output_sigma_factor", "sigma", "lambda", "learning_rate", "compression_learning_rate", "non_compressed_features", "compressed_features", "num_compressed_dim", "w2c", "pos","z_npca", "z_pca", "alphaf_num", "alphaf_den", "old_cov_matrix", "projection_matrix", "positions", "max_response","im","target_sz","sz"};    mxArray *params = mxCreateStructMatrix(1,1,22, fields);    mxSetField(params, 0, "padding", mxCreateDoubleScalar(1.0));    mxSetField(params, 0, "output_sigma_factor", mxCreateDoubleScalar(1.0 / 16));    mxSetField(params, 0, "sigma", mxCreateDoubleScalar(0.2));    mxSetField(params, 0, "lambda", mxCreateDoubleScalar(1e-2));    mxSetField(params, 0, "learning_rate", mxCreateDoubleScalar(0.075));    mxSetField(params, 0, "compression_learning_rate", mxCreateDoubleScalar(0.15));    mxSetField(params, 0, "non_compressed_features", mxCreateString("gray"));    mxSetField(params, 0, "compressed_features", mxCreateString("cn"));    mxSetField(params, 0, "num_compressed_dim", mxCreateDoubleScalar(2));    mxSetField(params, 0, "w2c", pMxArray);    .......

法二:建立c++ shared library
此方法老是出现问题在调试的时候竟然是opencv的函数出了问题。。。。。
步骤:
1.matlab命令行输入deploytool
2.选择Library Compiler
3.建立compiler
这里写图片描述
4.此过程大概会有好几分钟到几十分钟,然后得到如下几个文件:
这里写图片描述
在for_testing或者for_redistribution_files_only里找到下面3个文件:
这里写图片描述

这3个文件事实上就是自己的库了,然后照添加库的操作把其添加到自己的环境中即可。我的方法:将dll文件拖入c:\system32中(或者通过动态链接库来做,不过c++做这个比较麻烦,直接拖最快),.lib的文件路径直接加到vc directory中,然后.h文件加入工程。
5调用的时候需要初始化,并且任何根matlab数据结构有关的操作都应该是在….之中,否则会报错,无法初始化:

mclInitializeApplication(NULL, 0);xxxxInitialize();....xxxxTerminate();mclTerminateApplication();
1 0
原创粉丝点击