美文网首页
vc与matlab 混编

vc与matlab 混编

作者: Drlilian | 来源:发表于2019-06-26 09:21 被阅读0次

    2011-05-05
    己写好的matlab*.m文件做成动态链接库dll的形式,然后呢,vc动态调用它

    废话少说。上例子。

    一、 编写matlab 函数

    myfun.m

    function y=myfun(timeend)

    t=0:0.001:timeend;

    y=sin(2*pi*50*t);

    plot(y);

    二、Matlab编译环境的设置

    输入命令   mbuild  -setup                  %你选择vc6.0那个

    输入命令       cd(prefdir);

    输入命令   mex   -setup                        %你选择vc6.0那个

    输入命令      cd(prefdir);

    输入命令   mcc -B csglsharedlib:mylib myfun               %mylib是你命名的生成的库,myfun是你的m文件名,中间还有分号

    到此生成了.c; .h;. lib; dll等文件。

    三、VC工程环境的设置

    这里比较乱。

     1) 设置Include 和Library 目录

    在VC++ IDE 中选择Tools->Options->Directories。

    a  在Show directoris for:中选择Include files, 添加如下两个目录:

    D:\program files\matlab\extern\include\win32

    D:\program files\matlab\extern\include

    b  在Show directoris for:中选择Library files, 添加如下两个目录:

    D:\program files\matlab\extern\lib\win32\microsoft

    D:\program files\matlab\extern\lib\win32

    2) 工程(project)本身的一些设置

    在VC++ IDE 中选择Project->Setting->C/C++

    在Category 中选择Code Generation, 在Use run-time library 中选择Multithreaded DLL。

    在Category 中选择Precompiled Headers,选择Automatic use of precompiled headers, 并且在Through header 下面添加stdafx.h。

    在Category 中选择Preprocessor , 在preprocessor definitions 中添加MSVC,MSWIND,IBMPC.

    在VC++ IDE 中选择Project->Settings->Link

    在Categories 中选择Input, 在Ignore libraries:中填入: msvcrt.lib。

                                                 在Object\libraries module 填入:libmex.lib libut.lib mclmcrrt.lib libeng.lib mylib.lib libmx.lib

    ( 3) 为工程添加相应的文件

    把刚才生成的mylib.h  mylib.lib 和D:\program files\matlab\extern\lib\win32\microsoft下的所有*.lib文件复制到VC++工程的文件夹

    下, 并且用add files to project … 添加的工程中。把mylib.dl添加到工程中的debug里面。

    四 vc程序

    建立一个对话框工程mypro

    mypro.dlg 源文件里加入#include "mylib.h"

    确定按钮里面写函数

    void CMyproDlg::OnOK() 

    {

    //注册动态链接库

    mylibInitialize();

    CString str;

    double x=0.04;

    //创建mxArray 型数据并对其赋值

    mxArray * pArrayIn=NULL;

    mxArray *pArrayOut=NULL;

    pArrayIn=mxCreateDoubleMatrix(1,1,mxREAL);

    memcpy(mxGetPr(pArrayIn),&x,sizeof(double));

    //或者使用t=mxCreateDoubleScalar(x)

    //或者使用Matlab 数学库中的函数mlfAssign()等

    //使用mylib.dll 中的函数

    mlfMyfun(1,&pArrayOut, pArrayIn);

    double * md=mxGetPr(pArrayOut);

    double    result1=md[0];

    str.Format ("It is : %f",result1);

    ::AfxMessageBox(md);

    //销毁t, 释放内存

    mxDestroyArray(pArrayIn);

    mxDestroyArray(pArrayOut);

    //注销动态链接库

    mylibTerminate();

    CDialog::OnOK();

    }

    另一个实现x1+x2的vc程序如下

    void CMattDlg::OnButton1() 

    {

    //在matlab中定义的m文件:myfun,其功能是完成两个数的相加操作。

                   CString str;

                UpdateData(true);

                pppInitialize();

                //为了调用matlab中的函数,必须使用数组数据类型,并其后调用matlab函数将其转化为矩阵格式(matlab的基本数据类型是矩阵)

                static double x1[1]={1.0};

                static double x2[1]={2.5};

                double result1;

                //调用matlab创建3个矩阵

                mxArray *A=NULL;

                mxArray *B=NULL;

    mxArray *C=NULL;

    A=  mxCreateDoubleMatrix(1,1,mxREAL);

    B=  mxCreateDoubleMatrix(1,1,mxREAL);

    * (mxGetPr(A))=1.0;

    * (mxGetPr(B))=1.0;

    mlfMyfunct(1,&C,A,B);

    //将matlab中的矩阵的指针传递给C语言中的指向double的指针

                double * md=mxGetPr(C);

                result1=md[0];

                //释放这些矩阵

                mxDestroyArray(A);

                mxDestroyArray(B);

                mxDestroyArray(C);

                str.Format ("It is : %f",result1);

                ::AfxMessageBox(str);

    }

    参考文献http://blog.csdn.net/answermj/archive/2010/04/21/5513219.aspx

     http://blog.sina.com.cn/s/blog_61e6344d0100ive3.html

    http://hi.baidu.com/%D3%F9%BD%A3%D1%B0%CF%C9%C9%CF%B9%E3%BA%AE/blog/item/dd98e8f2c1eec65a342acc6a.html

    http://wenku.baidu.com/view/1b73a7db50e2524de5187e6b.html百度文库

                  浅谈matlab 与混编技术.ppt 电脑里编程练习里面存的。

    相关文章

      网友评论

          本文标题:vc与matlab 混编

          本文链接:https://www.haomeiwen.com/subject/qelzxctx.html