vs2013調用matlab函數

法一(常用方法):使用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();
發佈了34 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章