zoukankan      html  css  js  c++  java
  • VC6调用matlab7里的m程序的案例及方法

    凡兄弟 发表于 2005-11-9 14:30:32
    VC + MATLAB7 C Shared Library
    所有调用MATLAB7 Compiler产生的共享库的程序都具有如下的大致结构:
    1. 声明变量或者是函数作为输入变量;
    2. 调用 mclInitalizeApplication函数,并测试是否成功,该函数设置了一个全局的MCR状态,并且构建MCR实例;
    3. 对于每个库,调用一次<libraryname>Initalize函数,为库创建一个MCR实例;
    4. 调用库中的函数,并处理其结果(这是程序的主要部分);
    5. 为每个库调用一次<libraryname>Terminate函数,用于注销相联系的MCR;
    6. 调用mclTerminateApplication函数,释放与全局MCR状态相联系的资源;
    7. 清除变换,关闭文件等,然后退出。
    根据MATLAB的帮助文档中提供的例子,利用如下文件进行练习:
    <matlabroot>/extern/examples/compiler/addmatrix.m
    <matlabroot>/extern/examples/compiler/multiplymatrix.m
    <matlabroot>/extern/examples/compiler/eigmatrix.m
    实现步骤:
    1) 先将这几个文件拷贝到当前目录下,然后利用mcc创建共享库,指令如下:
    mcc –v -B csharedlib:libmatrix addmatrix.m multiplymatrix.m eigmatrix.m
    其中,操作参数 -B csharedlib 是一个绑定的操作,其等效指令为 -W lib:<libname> -T link:lib。
    2)在VC中创建一个MFC工程(本人创建的为基于对话框的),环境设置根据如下帖子:怎样设置 Visual Studio 与 Matlb Complier 4.0 一起工作 中的指导进行。在本例子中,只需要在VC中进行如下步骤:
    A. Tools->Options->Directories->Show directories for:Include files-><matlab7root> \Extern\Include;
    B. Tools->Options->Directories->Show directories for:Library files-><matlab7root> \Extern\Lib\Win32\Microsoft\msvc60;
    C. Project->Setting->C/C++->Category:Code Generation->Use run-time library:Debug Multithread DLL;
    D. Project->Setting->Link->Category:Input->Object/library modules:mclmcrrt.lib libmatrix.lib(mcc生成的共享库)。
    3)拷贝MATLAB当前目录下刚才用mcc生成的libmatrix.h,libmatrix.dll,libmatrix.lib,以及 libmatrix.ctf文件到VC当前工程目录下,并用Project->Add to Project->Files…将libmatrix.h加入到当前工程中。
    4)在当前工程的对话框的头文件中加入#include "libmatrix.h" 与 #include "mclmcr.h";
    5)在BOOL CMatlab7dllDlg::OnInitDialog()中进行MATLAB库文件的初始化,在void CMatlab7dllDlg::OnDestroy()中进行MATLAB库文件资源的释放,否则可能出现按钮只能够按一次,第二次运行则出错的现象;
    6)调用MATLAB产生的库文件中函数的处理函数定义在一个按钮的响应函数中,并且要注意的是:如果一个mxArray变量需要重用的时候,必须用mxDestroyArray(out); out=0;即先进行变量注销,再设置为空。
    附上这几个主要函数如下:
    1.BOOL CMatlab7dllDlg::OnInitDialog()
    {
       CDialog::OnInitDialog();
        ……………
        // TODO: Add extra initialization here
       /* Call the mclInitializeApplication routine. Make sure that the application
        * was initialized properly by checking the return status. This initialization
        * has to be done before calling any MATLAB API's or MATLAB Compiler generated
        * shared library functions.  */
       if( !mclInitializeApplication(NULL,0) )
       {
           AfxMessageBox( "Could not initialize the application.");
           exit(1);
       }
       /* Call the library intialization routine and make sure that the
        * library was initialized properly. */
       if (!libmatrixInitialize())
       {
           AfxMessageBox("Could not initialize the library.");
           exit(1);
       }
    return TRUE;  // return TRUE  unless you set the focus to a control
    }

    2.void CMatlab7dllDlg::OnDestroy()
    {
    CDialog::OnDestroy();
    /* Call the library termination routine */
    libmatrixTerminate();
     mclTerminateApplication();
    }

    3.void CMatlab7dllDlg::OnRUN()
    {
    CString str;
    mxArray *in1, *in2; /* Define input parameters */
       mxArray *out = NULL;/* and output parameters to be passed to the library functions */
       
       double data[] = {1,2,3,4,5,6,7,8,9};

       /* Create the input data */
       in1 = mxCreateDoubleMatrix(3,3,mxREAL);
       in2 = mxCreateDoubleMatrix(3,3,mxREAL);
       
    memcpy(mxGetPr(in1), data, 9*sizeof(double));
       memcpy(mxGetPr(in2), data, 9*sizeof(double));
      
       /* Call the library function */
       mlfAddmatrix(1, &out, in1, in2);
       /* Display the return value of the library function */
       str="The value of added matrix is:\n";
    str = str + Display(out);
    AfxMessageBox(str);

       /* Destroy the return value since this varaible will be resued in
        * the next function call. Since we are going to reuse the variable,
        * we have to set it to NULL. Refer to MATLAB Compiler documentation
        * for more information on this. */
    mxDestroyArray(out); out=0;

       mlfMultiplymatrix(1, &out, in1, in2);
       str = "The value of the multiplied matrix is:\n";
    str = str+Display(out);
    AfxMessageBox(str);

    mxDestroyArray(out); out=0;

       mlfEigmatrix(1, &out, in1);
       str = "The Eigen value of the first matrix is:\n";
    str = str+Display(out);
    AfxMessageBox(str);

       mxDestroyArray(out); out=0;
       /* Free the memory created */
       mxDestroyArray(in1); in1=0;
       mxDestroyArray(in2); in2 = 0;

    AfxMessageBox("OK, Finished!");
    }

    4.CString CMatlab7dllDlg::Display(const mxArray *in)
    {
     CString str, strout=" ";
       int i=0, j=0; /* loop index variables */
       int r=0, c=0; /* variables to store the row and column length of the matrix */
       double *data; /* variable to point to the double data stored within the mxArray */
       /* Get the size of the matrix */
       r = mxGetM(in);
       c = mxGetN(in);
       /* Get a pointer to the double data in mxArray */
       data = mxGetPr(in);
         /* Loop through the data and display the same in matrix format */
       for( i = 0; i < c; i++ ){
           for( j = 0; j < r; j++){
               str.Format("%4.2f\t",data[i*c+j]);
    strout = strout+str;
           }
           strout = strout+"\n";
       }
       strout = strout +"\n";
    return strout;
    }

    5.附m文件:
    1)addmatrix.m
    function a = addmatrix(a1, a2)
    %ADDMATRIX Add two matrices
    % Copyright 2003 The MathWorks, Inc.
    a = a1 + a2;

    2) multiplymatrix.m
    function m = multiplymatrix(a1, a2)
    %MULTIPLYMATRIX Multiplies two matrices
    % Copyright 2003 The MathWorks, Inc.
    m =  a1*a2;

    3) eigmatrix.m
    function e = eigmatrix(a1)
    %EIGMATRIX Returns the eigen value of the given matrix
    % Copyright 2003 The MathWorks, Inc.
    e = eig(a1);

    发布到目标机器上的时候需要拷贝过去的文件有:MCRInstaller.exe,工程文件的可执行程序,共享库(DLL),共享库对应的.ctf文件。点击运行MCRInstaller.exe文件,安装好MCR之后,将<mcr_root>\runtime\win32加入到系统的环境变量 path中去。
  • 相关阅读:
    JS高级-虚拟DOM
    JS高级-异步
    tomcat server.xml中文版
    java中的等于
    eclipse version
    angularjs中父,子,兄之间controller值得传递
    《那一天,那一月,那一年,那一世》-------仓央嘉措
    用jsonp格式的数据进行ajax post请求变成get
    git常用指令
    让div支持placeholder属性/模拟输入框的placeholder属性
  • 原文地址:https://www.cnblogs.com/yunbo/p/541243.html
Copyright © 2011-2022 走看看