打印

VS2005 与 Matalab R2007b(7.5)混合编程 总结

[复制链接]
680|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sode|  楼主 | 2017-11-16 17:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
VS2005 与 Matalab R2007b(7.5)混合编程 总结

一、       环境配置
       1)编程环境
       操作系统:Windows XP;
       开发工具:VS2005(Visual C++ 2005) ,MATLAB R2007b(7.5);
       安装路径:VS2005   C:/Program Files/Microsoft Visual Studio 8 ;     Matalab7.5  D:/Program Files/MATLAB/R2007b
       注意:安装时,要先装VS2005后装MATLAB R2007b,因为MATLAB R2007b要用到Visual C++ 2005中的.NET框架。
       起初,我的matalab是6.5版本的,然后进行环境配置的时候怎么也找不到vc++2005,查阅了很多资料之后,我发现应该6.5版本太低了,不支持和vs2005混编。
       2)配置编译器
       使用 mbuild -setup和 mex -setup两个命令对编译器进行配置,两个命令均选择 Microsoft Visual C++ 2005。
       注意:mbuild(mex)和 –setup 之间有一个空格;没有空格就会出错!
       1.       mbuild –setup
>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:/PROGRA~1/MATLAB/R2007b/sys/lcc
[2] Microsoft Visual C++ 2005 in C:/Program Files/Microsoft Visual Studio 8
[0] None
Compiler: 2
Please verify your choices:
Compiler: Microsoft Visual C++ 2005
Location: C:/Program Files/Microsoft Visual Studio 8
Are these correct?([y]/n): y
****************************************************************************
  Warning: Applications/components generated using Microsoft Visual Studio  
           2005 require that the Microsoft Visual Studio 2005 run-time      
           libraries be available on the computer used for deployment.      
           To redistribute your applications/components, be sure that the   
           deployment machine has these run-time libraries. More information
           is at:                                                            
****************************************************************************
Trying to update options file: C:/Documents and Settings/Administrator/Application Data/MathWorks/MATLAB/R2007b/compopts.bat
From template:              D:/PROGRA~1/MATLAB/R2007b/bin/win32/mbuildopts/msvc80compp.bat
Done . . .

       2.mex –setup
  • >> mex -setup
  • MEX –setup,与mbuild 配置方法相同。

复制代码
      这样,matlab 编译环境配置成功了。
       虽然,这里有warning,但是不影响,可以继续进行后面的操作。我试图解决warning 及它下面的错误,照样从网站上下了vcredist_x86.exe然后进行安装;并且将msvc80opts.bat从D:/PROGRA~1/MATLAB/R2007b/bin/win32/mexopts/拷到C:/Documents and Settings/Administrator/Application Data/MathWorks/MATLAB/R2007b 替换mexopts.bat,但是都不管用,重新执行上述两个编译指令进行编译,仍然是有这样的错误,至今不得解!由于不影响后来的操作,无奈,我暂时放弃这个疑团!

       3.       vs2005 环境配置
       第一步:工具->选项->项目和解决方案->vc++目录
       显示以下内容的目录:包含文件  添加  MATLABROOT/R2007b/extern/include
       显示以下内容的目录:库文件    添加  MATLABROOT/R2007b/extern/include  MATLABROOT /R2007b/extern/lib/win32/microsof


       第二步:项目->项目名字属性页 ->C/C++ ->常规     附加包含目录
       MATLABROOT/R2007b/extern/include/win32

       链接器->常规  附加库目录   MATLABROOT/R2007b/extern/include/win32/microsoft

       链接器->输入  附加依赖项  添加    libfxtu.lib      mclmcrrt.lib

       二、 程序实现
       1)matalab程序文件名字为 :  fxtu.m
       a.编写程序
  • function beam = fxtu(w1,w2)
  • m=4;                                      % sensors
  • n=2;                                      % sources
  • d=1/2;                                    % 1/2 lambada
  • L=100;                                    % resolution in [-90' 90']
  • %w1 = [0.2400 + 0.0019i 0.2400 - 0.0005i 0.2400 - 0.0019i 0.2400 + 0.0019i ];
  • %w2 = [0.2400 + 0.0019i 0.2400 - 0.0005i 0.2400 - 0.0019i 0.2400 + 0.0019i ];
  • beam=zeros(1,L);
  • for i = 1 : L
  •    a=exp(-j*2*pi*d*[0:m-1].'*sin( -pi/2+ pi*(i-1)/L));
  •    beam(i)=20*log10(abs(w1*a)+abs(w2*a));
  • end
  • % plotting command followed
  • %figure
  • angle=-90:180/L:(90-180/L);
  • %plot(angle,beam);
  • polar(angle *pi /180, beam +50);
  • xlabel('angle');
  • ylabel('power dbm');
  • end

复制代码
      b. 执行程序
       我们执行如下语句将matalab的fxtu 函数编译成一个c++接口的DLL:
       mcc -W cpplib:libfxtu -T link:lib fxtu.m
       执行结果,我们会得到如下一系列文件:

       我们只需要libfxtu.h    libfxtu.dll  libfxtu.lib  libfxtu.ctf  四个文件!
       注意:
       1.     执行上述命令 产生的文件在你所设置的current directory 目录里面,如下

       2.     如果你执行该指令时current directory 设置为work D:/Program Files/MATLAB/R2007b/work.就会出现如下错误:
       Warning: Duplicate directory name: D:/Program Files/MATLAB/R2007b/work.
       3.     这个并不妨碍,只要改一下目录就可以了,我的改成D:/Program Files/MATLAB/R2007b/work.
       那么你执行命令所产生的一系列文件就会在这个文件夹里面。
       2) VS2005程序
       这里我用的是MFC对话框程序。
a.编写程序
       建MFC对话框工程,将matalab mcc编译的libfxtu.h    libfxtu.dll  libfxtu.lib  libfxtu.ctf四个文件拷入工程目录中,并添加到工程中去。其中相关代码主要有:
       类视图 Cp3APP 中的 InitInstance(void)中添加如下代码:
  • if(!mclInitializeApplication(NULL,0))
  •     {
  •         AfxMessageBox(_T("不能初始化应用程序!"));                  
  •          return TRUE;
  •     }
  •     if(!libfxtuInitialize() )
  •     {
  •        AfxMessageBox(_T("不能初始化库!"));
  •          return TRUE;
  •     }

复制代码
      类视图 Cp3APP 中的ExitInstance() 代码如下:
  • int Cp3App::ExitInstance()
  • {
  •     // TODO: 在此添加专用代码和/或调用基类
  • libfxtuTerminate();
  • mclTerminateApplication();

  •     return CWinApp::ExitInstance();
  • }

复制代码
      对话框按钮操作:
  • void Cp3Dlg::OnBnClickedButton4()
  • {
  •     // TODO: 在此添加控件通知处理程序代码
  •     CString r_qz1,r_qz2,r_qz3,r_qz4,r_qz5,r_qz6,r_qz7,r_qz8;//r   实部
  •     CString i_qz1,i_qz2,i_qz3,i_qz4,i_qz5,i_qz6,i_qz7,i_qz8;//i   虚部
  •     GetDlgItemText(IDC_EDIT13,r_qz1);//权值
  •     GetDlgItemText(IDC_EDIT14,r_qz2);//权值
  •     GetDlgItemText(IDC_EDIT15,r_qz3);//权值
  •     GetDlgItemText(IDC_EDIT16,r_qz4);//权值
  •     GetDlgItemText(IDC_EDIT17,r_qz5);//权值
  •     GetDlgItemText(IDC_EDIT18,r_qz6);//权值
  •     GetDlgItemText(IDC_EDIT19,r_qz7);//权值
  •     GetDlgItemText(IDC_EDIT20,r_qz8);//权值

  •     GetDlgItemText(IDC_EDIT21,i_qz1);//权值
  •     GetDlgItemText(IDC_EDIT22,i_qz2);//权值
  •     GetDlgItemText(IDC_EDIT23,i_qz3);//权值
  •     GetDlgItemText(IDC_EDIT24,i_qz4);//权值
  •     GetDlgItemText(IDC_EDIT25,i_qz5);//权值
  •     GetDlgItemText(IDC_EDIT26,i_qz6);//权值
  •     GetDlgItemText(IDC_EDIT27,i_qz7);//权值
  •     GetDlgItemText(IDC_EDIT28,i_qz8);//权值

  •     float d_r_qz1,d_r_qz2,d_r_qz3,d_r_qz4,d_r_qz5,d_r_qz6,d_r_qz7,d_r_qz8;
  •     float d_i_qz1,d_i_qz2,d_i_qz3,d_i_qz4,d_i_qz5,d_i_qz6,d_i_qz7,d_i_qz8;

  •     d_r_qz1 = (float)atof((char *)(LPTSTR)(LPCTSTR)r_qz1);
  •     d_r_qz2 = (float)atof((char *)(LPTSTR)(LPCTSTR)r_qz2);
  •     d_r_qz3 = (float)atof((char *)(LPTSTR)(LPCTSTR)r_qz3);
  •     d_r_qz4 = (float)atof((char *)(LPTSTR)(LPCTSTR)r_qz4);
  •     d_r_qz5 = (float)atof((char *)(LPTSTR)(LPCTSTR)r_qz5);
  •     d_r_qz6 = (float)atof((char *)(LPTSTR)(LPCTSTR)r_qz6);
  •     d_r_qz7 = (float)atof((char *)(LPTSTR)(LPCTSTR)r_qz7);
  •     d_r_qz8 = (float)atof((char *)(LPTSTR)(LPCTSTR)r_qz8);

  •     d_i_qz1 = (float)atof((char *)(LPTSTR)(LPCTSTR)i_qz1);
  •     d_i_qz2 = (float)atof((char *)(LPTSTR)(LPCTSTR)i_qz2);
  •     d_i_qz3 = (float)atof((char *)(LPTSTR)(LPCTSTR)i_qz3);
  •     d_i_qz4 = (float)atof((char *)(LPTSTR)(LPCTSTR)i_qz4);
  •     d_i_qz5 = (float)atof((char *)(LPTSTR)(LPCTSTR)i_qz5);
  •     d_i_qz6 = (float)atof((char *)(LPTSTR)(LPCTSTR)i_qz6);
  •     d_i_qz7 = (float)atof((char *)(LPTSTR)(LPCTSTR)i_qz7);
  •     d_i_qz8 = (float)atof((char *)(LPTSTR)(LPCTSTR)i_qz8);

  •     /*if (!IsDouble(r_qz1) || !IsDouble(r_qz2) || !IsDouble(r_qz3) || !IsDouble(r_qz4)/
  •        || !IsDouble(r_qz5) ||   !IsDouble(r_qz6) || !IsDouble(r_qz7) || !IsDouble(r_qz8) /
  •        || !IsDouble(i_qz1) ||   !IsDouble(i_qz2) || !IsDouble(i_qz3) || !IsDouble(i_qz4) /
  •        || !IsDouble(i_qz5) ||   !IsDouble(i_qz6) || !IsDouble(i_qz7) || !IsDouble(i_qz8) )
  •     {
  •        AfxMessageBox(_T("输入格式不正确,请重新输入!"));
  •        return;
  •     }

  • */
  •     try
  •     {
  •        double data1[4];//w1 real
  •        double data2[4];//w2 real

  •        double data3[4];//w1 imag
  •        double data4[4];//w2 imag

  •        data1[0] = d_r_qz1;
  •        data1[1] = d_r_qz2;
  •        data1[2] = d_r_qz3;
  •        data1[3] = d_r_qz4;
  •    
  •        data2[0] = d_r_qz5;
  •        data2[1] = d_r_qz6;
  •        data2[2] = d_r_qz7;
  •        data2[3] = d_r_qz8;

  •        data3[0] = d_i_qz1;
  •        data3[1] = d_i_qz2;
  •        data3[2] = d_i_qz3;
  •        data3[3] = d_i_qz4;

  •        data4[0] = d_i_qz5;
  •        data4[1] = d_i_qz6;
  •        data4[2] = d_i_qz7;
  •        data4[3] = d_i_qz8;

  •        mwArray w1(1,4,mxDOUBLE_CLASS,mxCOMPLEX);
  •        mwArray w2(1,4,mxDOUBLE_CLASS,mxCOMPLEX);

  •        w1.Real().SetData(data1,4);
  •        w1.Imag().SetData(data3,4);
  •        w2.Real().SetData(data2,4);
  •        w2.Imag().SetData(data4,4);

  •        mwArray beam;
  •        fxtu(1,beam,w1,w2);

  •     }
  •     catch (const mwException& e)
  •     {
  •        CString error(e.what());
  •        MessageBox(error);
  •     }
  •     catch (...)
  •     {
  •        MessageBox(_T("错误!"));
  •     }
  • }

复制代码
      b.编译程序
       执行结果:


       注意:
       这里,我们的matalab产生的dll 函数 输入是复数矩阵;关于mwArray 类的操作,我们可以看它的声明。
  • mwArray Imag() - Return mwArray that references imaginary part of complex array
  • C++ Syntax
  • #include "mclcppclass.h"
  • double rdata[4] = {1.0, 2.0, 3.0, 4.0};
  • double idata[4] = {10.0, 20.0, 30.0, 40.0};
  • mwArray a(2, 2, mxDOUBLE_CLASS, mxCOMPLEX);
  • a.Real().SetData(rdata, 4);
  • a.Imag().SetData(idata, 4);



相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1049

主题

1522

帖子

8

粉丝