前一篇文章写了vs.net
2003与matlab混合编程的matlab部分的设置,接下来是vs.net 2003
的设置。这些
很多网站上都有,而且出自同一篇文章,以下转贴:
下面在VC中实现该程序的功能,步骤如下:
1、在VC中打开ex1.c文件(该文件在该目录下:matlab根目录\extern\examples\cmath)
2、设置头文件和库文件路径:工具->选择,目录
在inlude选项中添加如下路径:
;D:\matlab\extern\include\cpp
;D:\matlab\extern\include
在Library选项中添加如下路径
;D:\matlab\extern\lib\win32\microsoft\msvc60
;D:\matlab\extern\lib
;D:\matlab\bin
(注意,path是用";"分隔的)
添加库文件:工程->设置->Link
在General选项中的“对象库/模块”中将目录
D:\matlab\extern\lib\win32\microsoft\msvc60目录下的所有库文件名写上:
libeng.lib
libmat.lib
libmatlb.lib
libmex.lib
libmmfile.lib
libmwmcl.lib
libmwservices.lib
libmwsglm.lib
libmx.lib
libut.lib
mclcommain.lib
mclxlmain.lib
sgl.lib
(注意是用回车分隔,不是分号)
这一步原文不完善,事实上首先要从下面函数定义文件(*.def)生成相应的导入库文件(*.lib)
如:
libmmfile.def
libmcc.def
libmatlb.def
libmx.def
libmat.def
它们位于目录c:\matlab\extern\include
用下面命令导出库文件:
lib /def:libmmfile.def /out:libmmfile.lib /machine:ix86
lib /def:libmcc.def /out:libmcc.lib /machine:ix86
lib /def:libmatlb.def /out:libmatlb.lib /machine:ix86
lib /def:libmx.def /out:libmx.lib /machine:ix86
lib /def:libmat.def /out:libmat.lib /machine:ix86
这是在matlab5.0下。到matlab6.0下,libmcc.def
已经更新为libmex.def,所以要写成:
lib /def:libmex.def /out:libmex.lib /machine:ix86
(这里使用到lib命令,这就是我们要设置vs.net
2003的环境变量的原因之一,剩下的*.lib文件如果在
C:\MATLAB6p5p1\extern\lib\win32下找不到的话,就要用同样的方法来生成)
然后将生成的*.lib文件全部从c:\matlab\extern\include 目录copy 到
C:\MATLAB6p5p1
\extern\lib\win32 目录。
经过以上设置,matlab和vc.net
2003的对接成功完成,剩下的工作就是用matlab的mcc命令 将*.m编译成
*.cpp 和
*.h(生成*.h,*.lib和*.dll文件,编译器的设置是一样的,只是mcc
命令的参数不一样)到vc7
下运行了。
以下转贴:
1、在MATLAB中编写如下函数:
function [x]=gjfcz(A,b)
%A=[-1.5 1 2; 4 2 3 ; -3 2 8]
%b=[3;5;6]
x=A\b
保存名为gjfcz.m,该函数的功能为求解线形方程组,可参考第四章的内容。
2、在MATLAB的命令窗口输入以下命令:
mcc –m gjfcz.m
该命令用来生成对应的C文件和可执行程序。在MATLAB工作目录下(一般是MATLAB\work)将会生成如下文件
:gjfcz.exe,gjfcz.c,gjfcz.h,gjfcz_main.c,其中gjfcz.c,gjfcz.h是我们需要的文件。
3、新建名为JXXFC基于对话框的工程,面板上添加一个按扭。
4、拷贝gjfcz.c,gjfcz.h两文件到工程目录下,并将文件引入工程(Project->Add
to Project->Files)。
5、为按扭添加如下响应代码:
void CJXXFCDlg::OnButton1()
{
static double
Adata[]={-1.5,4,-3,1,2,2,2,3,8};
static double bdata[]={3,5,6};
double Xdata[100];
mxArray *A =
NULL;//赋初值
mxArray *b =
NULL;
mxArray *x =
NULL;
/*
使用自动内存管理*/
mlfEnterNewContext(0, 0);
//创建矩阵
mlfAssign(&A, mlfDoubleMatrix(3, 3, Adata, NULL));
mlfAssign(&b, mlfDoubleMatrix(3, 1, bdata, NULL));
InitializeModule_gjfcz();
x=mlfGjfcz(A,b);//调用gjfcz.c中的函数求解
TerminateModule_gjfcz();
memcpy(Xdata,mxGetPr(x),3*sizeof(double));
//
mxGetPr(x)用来得到x的地址
CString R;
R.Format("%f\n%f\n%f",Xdata[0],Xdata[1],Xdata[2]);
MessageBox(R);
/*
释放矩阵所占的内存*/
mxDestroyArray(A);
mxDestroyArray(b);
mxDestroyArray(x);
/*
禁用自动内存管理*/
mlfRestorePreviousContext(0, 0);
}
编译、连接,运行ok.
注意,调用matlab生成的gjfcz模块前,需要写InitializeModule_gjfcz();调用结束,需要写
TerminateModule_gjfcz();
也可以编译成*.dll和*.h及*.lib来调用,及用com的方法调用,具体步骤见:
http://www.vckbase.com/document/finddoc.asp
在搜索中输入matlab 点击go,会找到
精通VC与MATLAB联合编程1——10系列。有详尽的说明。不足之处,本文已经做了补充。相互参考,就没
问题了。
关于VC与MATLAB混合编程,还建议参考:
http://blog.edu.cn/user2/zuoxinian/archives/2005/matlabvc.shtml
http://blog.21ic.com/user1/1949/archives/2006/18224.html
http://blog.csdn.net/yuanqingfei/articles/34627.aspx