matlab引擎成功在VC++中运行(VC++6.0 MFC)

来源:互联网 发布:淘宝茶叶店铺装修 编辑:程序博客网 时间:2024/06/10 18:11
一,对VC++的配置
     
              工具->选项->目录,分别配置lib和include
                             matlab引擎成功在VC++中运行(VC++6.0 MFC) - nichunquan1990 - nichunquan1990的博客
                                                                                          图一
                           matlab引擎成功在VC++中运行(VC++6.0 MFC) - nichunquan1990 - nichunquan1990的博客
                                                                                        图二
      接下来是每创建一个工程都需要修改的一个配置:
       工程->设置->连接,添加入libmx.lib libmat.lib libeng.lib
                   matlab引擎成功在VC++中运行(VC++6.0 MFC) - nichunquan1990 - nichunquan1990的博客
                                                                                           图三
二,工程创建 
                          在菜单栏menu上建立菜单,比如此处画图(ID什么的自己命名好,我的是ID_DATA_IN,最好见名知意)
                         matlab引擎成功在VC++中运行(VC++6.0 MFC) - nichunquan1990 - nichunquan1990的博客
                                                                                     图四
            
                    
                       按Ctrl+W进入MFC classwizard
               matlab引擎成功在VC++中运行(VC++6.0 MFC) - nichunquan1990 - nichunquan1990的博客
                                                                                               图五

插入代码如下:
    CString curPath;
    Engine *ep;        
mxArray *T = NULL, *D = NULL;         
double  t[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };      
// engOpen       
if (!(ep = engOpen(NULL))) {
AfxMessageBox ("Can't start MATLAB engine");
return; 
}           
// engPutVariable [mxCreateDoubleMatrix,mxDestroyArray]       
T = mxCreateDoubleMatrix(1, 10, mxREAL);
memcpy((void *)mxGetPr(T), (void *)t, sizeof(t));
engPutVariable(ep, "T", T);
engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
engEvalString(ep, "figure;");
engEvalString(ep, "line(T,D,'Color',[0,0.5,1],'Marker','s','MarkerFaceColor',[1 1 0]);");
engEvalString(ep, "title('Position vs. Time for a falling object');");
engEvalString(ep, "xlabel('Time (seconds)');");
engEvalString(ep, "ylabel('Position (meters)');");
engEvalString(ep, "grid on;");
mxDestroyArray(T);
// engGetVariable 
engEvalString(ep, "K=(1:length(D))'; D=[K,D',sin(K)]");      
    D=engGetVariable(ep, "D");
double  *dReal;
dReal = mxGetPr(D);
CString s,sTmp;
int m,n;
m = mxGetM(D);
n = mxGetN(D);
s.Format("(m,n)=(%d,%d)\r\n",m,n);
for(int i=0; i<m; i++){    
// please change <    
for(int j=0; j<n; j++){   
// please change <      
sTmp.Format("%5.11f",dReal[j*m+i]);
while(sTmp.GetLength()<17){ 
sTmp = " "+sTmp; 
}
s=s+sTmp+"  "; 
}
s=s+"\r\n";
}
s=s+"\r\n";
this->SetDlgItemText(IDC_EDIT1,s);
mxDestroyArray(D);
// engClose
AfxMessageBox ("Press enter to close engine");
engClose(ep);


        最前面不要忘记加#include “engine.h”,之前我直接把该头文件拷贝到了工程的文件夹里,保险起见~
       此处也可以先创建一个类然后在函数中应用。
                                   matlab引擎成功在VC++中运行(VC++6.0 MFC) - nichunquan1990 - nichunquan1990的博客
                                                                                      图六
          如果出现报错    “ Can't start MATLAB engine”,那么可以尝试启动matlab command window
                       1,运行cmd
                       2,在DOS命令行把文件夹定位到matlab中的bin下,(cd+文件夹名)运行matlab/regserver