VC和Matlab混编第一课

来源:互联网 发布:新疆大学图书馆数据库 编辑:程序博客网 时间:2024/04/29 15:04

  VC和Matlab混编,最常用的就是用前者编写界面EXE,后者编写算法DLL。特别是在后者擅长的领域,如数学、仿真等显得特别有意义。

  先说DLL生成。有下面一个m文件,实现加法功能,c=a+b,代码如下:

        function [c]=abc(a,b)
               c=a+b

   设文件名为abc.m。在Matlab中加载此文件后,执行,选择“Change Folder”,这样执行各命令时会容易找到路径。在命令行中输入下面命令进行编译:

  mcc -B csharedlib:AbcLib abc.m

  简单解释一下,mcc是编译命令,大概是Matlb-C-Compiler的首字母缩写;-B表示捆绑(Bound)参数,mcc的参数很多,有些编译的参数是常用的,不妨编写成一个集合,如这里的csharedlib,字面理解就是C共享库。AbcLib是最终生成的库名,abc.m是m文件名。

  编译执行完成后,在m文件的同目录下会出现很多文件,这里基本用到的就是.h文件,.c文件,lib文件,dll文件。用VC自带的Depends工具查看DLL,会发现导出函数自动加上了mlf前缀,如此处的mlfAbc。

  新建VC工程,Win32, Console还是MFC任意。文件中加入下面两行:

#include "AbcLib.h"

#pragma comment(lib,"AbcLib.lib")

  这里必须要注意,这两句请放得靠前一些,例如文件最上部。如果它们被放在最下面,往往会出现错误(是IFDEF、ELSE之类的宏产生了错乱)。另外需要包含的头文件还有:#include "mclmcr.h" 、 #include "matrix.h"。

  当然了,要把.h文件和.c文件加入工程。

  调用之前,需初始化一下,可以在InitInstance里或Dialog的Initialize里面,如下:

if(!AbcLibInitialize())   
{   
AfxMessageBox("初始化失败!");  
return TRUE;
}  

  结束时还要来一个终止:

  AbcLibTerminate();

  这两个函数都是DLL中自动生成的,直接调 用即可。

  以上,都是准备工作,下面调用Abc即DLL中的mlfAbc函数进行加法运算:

double a[1],b[1];
a[0] = 4;
b[0] = 11;
mxArray *x = mxCreateDoubleMatrix(1,1, mxREAL);
mxArray *y = mxCreateDoubleMatrix(1,1, mxREAL);

//mxDestroyArray(x); //销毁mxArray数组x和y。
//mxDestroyArray(y);

memcpy(mxGetPr(x), a, 1*sizeof(double)); //将数组x复制到mxarray数组xx中。
memcpy(mxGetPr(y), b, 1*sizeof(double)); //将数组x复制到mxarray数组yy中。

mxArray * pArrayOut;
pArrayOut = NULL;
mlfAbc(1,&pArrayOut,x,y);

CString s;
s.Format("%f",*(mxGetPr(pArrayOut)));
AfxMessageBox(s);

  解释一下。Matlab中并未具体定义数据类型,像C++中的int, char, long,在Matlab中统统没有,Matlab中所有数据类型都是矩阵(数组),哪怕是一个数,也要看成是一个1X1的数组,double型。这里,用a[0]和b[0]来构造两个输入参数。用mxArray *类型来接收转换后的地址,这样Matlab才会认识。

  加法演示完啦,明年再写第二课……。

0 1
原创粉丝点击