vc与matlab 混编
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://wenku.baidu.com/view/1b73a7db50e2524de5187e6b.html百度文库
浅谈matlab 与混编技术.ppt 电脑里编程练习里面存的。