vc与matlab 混编

2019-06-26  本文已影响0人  Drlilian

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 电脑里编程练习里面存的。

上一篇下一篇

猜你喜欢

热点阅读