matlab与net3.5,论vs.net2003的缺陷兼及与matlab的混合编程(续)

前一篇文章写了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值