让Visual Studio 调用Matlab的扩展

    技术2024-07-27  23

    1、首先你得有matlab的扩展库,不如安装一个matlab。

    2、其次,打开Visual Studio,在"工具">"选项"中的"项目和解决方案"中的"VC++目录",然后设置:

    包含文件:MATLAB 根目录/R2008a/extern/include

    库文件:MATLAB 根目录/R2008a/extern/lib/win32/microsoft

     

     

    3、在工程上单击右键,选择"属性",在连接器中的输入中写上"libmx.lib libmat.lib libeng.lib",确定。

     

     

    4、之后就可以变成了。主要函数产看matlab帮助。

     

    以下是我对Matlab不成熟的封装:

    cls_mx_matrix是对matlab变量的封装。

    cls_mx是对引擎的封装。

     

    class cls_mx_matrix { private: mxArray* data; double* p_data; int dim_n; int dim_m; string str_name; void reset(mxArray* array) { mxDestroyArray(data); data = array; p_data = (double*)mxGetData(data); } public: int get_dim_n() { return dim_n; } int get_dim_m() { return dim_m; } void resize(int a_n,int a_m) { mxDestroyArray(data); dim_n = a_n; dim_m = a_m; data = mxCreateDoubleMatrix(dim_n,dim_m,mxREAL); p_data = (double*)mxGetData(data); } void get_subscript(cls_mx_matrix& that,int pos_i_begin,int pos_i_end,int pos_j_begin,int pos_j_end) { int len_i = pos_i_end - pos_i_begin + 1; int len_j = pos_j_end - pos_j_begin + 1; that.resize(len_i,len_j); for(int cnt_i=pos_i_begin;cnt_i<=pos_i_end;cnt_i++) { for(int cnt_j=pos_j_begin;cnt_j<=pos_j_end;cnt_j++) { that[make_pair(cnt_i - pos_i_begin,cnt_j - pos_j_begin)] = (*this)[make_pair(cnt_i,cnt_j)]; } } } void operator =(const cls_mx_matrix &that) { data = that.data; p_data = that.p_data; dim_n = that.dim_n; dim_m = that.dim_m; } cls_mx_matrix(string a_str_name,int a_n,int a_m) { str_name = a_str_name; dim_n = a_n; dim_m = a_m; data = mxCreateDoubleMatrix(dim_n,dim_m,mxREAL); p_data = (double*)mxGetData(data); } cls_mx_matrix(mxArray* array) { mxDestroyArray(data); data = array; p_data = (double*)mxGetData(data); } double& operator[] (pair<int,int> pos) { return p_data[pos.first*dim_m + pos.second]; } ~cls_mx_matrix() { mxDestroyArray(data); } friend class cls_mx; }; class cls_mx { private: Engine* eng; public: cls_mx() { eng = engOpen(NULL); } void set_var(cls_mx_matrix& mx_mat) { engPutVariable(eng,mx_mat.str_name.c_str(),mx_mat.data); } cls_mx_matrix get_var(string name) { return cls_mx_matrix(engGetVariable(eng,name.c_str())); } void get_var(cls_mx_matrix& that) { that.reset(engGetVariable(eng,that.str_name.c_str())); } void command(string str) { engEvalString(eng,str.c_str()); } ~cls_mx() { engClose(eng); } }; 

    最新回复(0)