zhanghongxing 发表于 2008-9-2 11:55

vc下如何调用用matlab编写的程序呢?

用vc变了界面,实现某种功能。但是vc下如何调用用matlab编写的进行矩阵运算的程序呢?我看了资料,说有三种,但具体不知怎么做?各位指点一下?或是提供一些实例!

sogooda 发表于 2008-9-2 13:44

推荐一本书《深入浅出MATLAB7.X混合编程》

科技在线 发表于 2008-9-2 18:27

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 = { 0.0 };

    static double b={ 0.0 };

    a=m_din;

    b=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;

mxDestroyArray(A);

    mxDestroyArray(B);

    mxDestroyArray(C);

    pppTerminate();

    UpdateData(FALSE);

}

为了使读者有一个更深入的了解。对以上关键性代码加以说明。UpdateData(TRUE)表示从屏幕接收数据,a=m_din;表示a存放m_din,即输入的待计算数值, b=m_select+1;表示 b “角度“,”弧度“的选择值。

由于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,static double b内容保持相同。

再使用mlfAssign(&C, mlfMyfunc(A, B))语句调用ppp.dll中的mlfMyfunc函数计算并返回结果到C中.

double * md=mxGetPr(C)语句作用是取得返回doulbe *指针,这样m_dout=md使得m_dout取得的内容就是C矩阵中的第一个元素(即在Matlab语言中为C(1) 的元素,在C/C++语言中,0指示的是数组的第一个元素).

这样一个DLL 调用就完成了,最终通过UpdateData(FALSE)语句把运算结果显示出来了。

以上程序中的某些函数用法中参见Matlab中的C Math帮助文件。

zhanghongxing 发表于 2008-9-3 19:36

好的。谢谢!学习中!
页: [1]
查看完整版本: vc下如何调用用matlab编写的程序呢?