声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1371|回复: 3

[混合编程] vc下如何调用用matlab编写的程序呢?

[复制链接]
发表于 2008-9-2 11:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

使用道具 举报

发表于 2008-9-2 13:44 | 显示全部楼层
推荐一本书《深入浅出MATLAB7.X混合编程》

评分

1

查看全部评分

发表于 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[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帮助文件。

评分

1

查看全部评分

 楼主| 发表于 2008-9-3 19:36 | 显示全部楼层
好的。谢谢!学习中!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-20 20:53 , Processed in 0.062561 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表