Matlab与C语言混合编程有四种方法
A.采用Matlab与C的接口规范来编程。
Matlab与C语言的接口采用称为MEX的动态链接库方式进行。按MEX接口规范编写的C原程序经过编译可生成Matlab动态链接子程序,它十分类似于Matlab的内建函数,可有Matlab直接调用。采用此规范可实现对Matlab原代码的加密。
B.用Matlab引擎来编程
Matlab引擎采用的是客户机/服务器(Client/Server)的计算方式。所谓客户机/服务器计算,就是把应用处理负载分布到客户机和服务器上的工作模式。客户机与服务器即可以存在于同一台计算机,也可以通过网络共享信息。一般情况下,客户机是运行软件的前端PC机,并且知道如何与服务器通讯;服务器于此对应,是接受信息,并采用相应行动的机器。由于客户机于服务器共同承担处理负载,可使系统性能得到极大提高。在一个实际应用中,可用VC活其它C,C++语言作为前端客户机,它向Matlab引擎发送命令和数据信息,可从Matlab引擎获得计算结果。
C. 用Matlab下的.m文件转化为VC可调用动态链接库(DLL)。
D.直接用C编程,通过对Matlab的数学库函数的调用实现Matlab语言的一般功能。
例子对VC与Matlab接口进行编程
对“计算”按钮消息处理函数编程如下
void CMytestDlg::OnOnCalculate()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
pppInitialize();
static double a[1] = { 0.0 };
static double b[1]= { 0.0 };
a[0]=m_din;
b[0]=m_select+1;
mxArray * A = mclGetUninitializedArray();
mxArray * B = mclGetUninitializedArray();
mxArray * C = mclGetUninitializedArray();
mlfAssign(&A, mlfDoubleMatrix(1, 1, a, NULL));
mlfAssign(&B, mlfDoubleMatrix(1, 1, b, NULL));
mlfAssign(&C, mlfMyfunc(A, B));
double * md=mxGetPr(C);
m_dout=md[0];
mxDestroyArray(A);
mxDestroyArray(B);
mxDestroyArray(C);
pppTerminate();
UpdateData(FALSE);
}
为了使读者有一个更深入的了解。对以上关键性代码加以说明。UpdateData(TRUE)表示从屏幕接收数据,a[0]=m_din;表示a[0]存放m_din,即输入的待计算数值, b[0]=m_select+1;表示 b[0] “角度“,”弧度“的选择值。
由于Matlab的计算基本单位是矩阵,而VC支持的基本数据类型是int,double等,所以要编写Matlab与vc之间的接口代码。如本例中C=myfunc(A,B)的函数,它编译成动态链接库后C形式代码为mlfAssign(&C, mlfMyfunc(A, B))。
要使Vc能调用它,必须首先创建三个mxArray *型指针变量 mxArray * A, mxArray * B, mxArray *C指向A,B,C矩阵(mxArray * A = mclGetUninitializedArray(); mxArray *B= ……),由于A,B是输入变量,故使用 mlfAssign(&A, mlfDoubleMatrix(1, 1, a, NULL)),mlfAssign(&B, mlfDoubleMatrix(1, 1, b, NULL))语句使得A,B矩阵中的元素与 double a[1],static double b[1]内容保持相同。
再使用mlfAssign(&C, mlfMyfunc(A, B))语句调用ppp.dll中的mlfMyfunc函数计算并返回结果到C中.
double * md=mxGetPr(C)语句作用是取得返回doulbe *指针,这样m_dout=md[0]使得m_dout取得的内容就是C矩阵中的第一个元素(即在Matlab语言中为C(1) 的元素,在C/C++语言中,0指示的是数组的第一个元素).
这样一个DLL 调用就完成了,最终通过UpdateData(FALSE)语句把运算结果显示出来了。
以上程序中的某些函数用法中参见Matlab中的C Math帮助文件。 |