VC与matlab混合编程

要使VC能调用DLL,还必须对VC进行以下操作。

(1)引入头文件和库文件

在mytestdlg.cpp的头部加入一行:#include “ppp.h”在project>settings->link下的object/libray modules下加入ppp.lib libmx.lib libmat.lib libmatlb.lib libmmfile.lib 目的是让VC能调用ppp.dll,引入libmx.lib libmat.lib libmatlb.lib 和libmmfile.lib的

目的是让VC能调用matlab的数学库函数和一些功能性函数编译VC与matlab的代码接口,和作者直接用C写的一些代码。

(2)对ppp.h做一点改动。

在#include “matlab.h”语句之后,加入-行extern “C”{,在最后一行#endif之前加入一行}。改动后的ppp.h文件内容如下:

#ifndef MLF_V2

#define MLF_V2 1

#endif

 

#ifndef __ppp_h

#define __ppp_h 1

 

#include "matlab.h"

extern "C" {

extern mxArray * mlfMyfunc(mxArray * x, mxArray * b);

extern void mlxMyfunc(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);

extern void pppInitialize(void);

extern void pppTerminate(void);

}

#endif。

 

 

(3)对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帮助文件。

(4)作完以上工作后,DLL就已被成功链入VC,再经VC编译器编译链接即可生成可执行文件,运行程序,在对话框中输入60,选择角度选项,

按计算按钮即可得到结果。

   

 

4.直接用C编程

直接用C编程也是可以的,它是通过对Matlab的数学库函数的调用来

实现的,如果能用Matlab实现的语句,就用不着非得用C直接编程因为直接用C编程与把.m文件通过mcc转换成的C代码是一样的的如要实现Matlab中的以下三行功能:

A=[1 2 3 4];

B=[4 3 2 1];

C=A+B;

自己直接用C要这样写

   static double a[4] = { 1.0, 2.0, 3.0, 4.0 };

static double b[4] = { 4.0, 3.0, 2.0, 1.0 };

      mxArray * A = mclGetUninitializedArray();

   mxArray * B = mclGetUninitializedArray();

       mxArray * C = mclGetUninitializedArray();

       mlfAssign(&A, mlfDoubleMatrix(1, 4, a, NULL));

       mlfAssign(&B, mlfDoubleMatrix(1, 4, b, NULL));

       mlfAssign(&C, mlfPlus(A, B));

而如果用mcc把上面三行转化为C代码以后为:

static double __Array0_r[4] = { 1.0, 2.0, 3.0, 4.0 };

static double __Array1_r[4] = { 4.0, 3.0, 2.0, 1.0 };

    mxArray * A = mclGetUninitializedArray();

       mxArray * B = mclGetUninitializedArray();

       mxArray * C = mclGetUninitializedArray();

       mlfAssign(&A, mlfDoubleMatrix(1, 4, __Array0_r, NULL));

mlfAssign(&B, mlfDoubleMatrix(1, 4, __Array1_r, NULL));

       mlfAssign(&C, mlfPlus(A, B));

    它们实质上是一样的,直接用C编程不如先写.m代码,再用mcc工具转换。

    对Matlab与VC编译器环境的配置工作与上面第3节介绍的一样。

注意:libmx.lib libmatlb.lib libmmfile.lib libmat.lib 文件并不是Matlab自带的,Matlab只提供了libmx.dll libmatlb.dll libmmfile.dll libmat.dll 用户需要自己编译,在VC有两种方式实现(推荐方式(2))

(1)VC集成编译环境中打开 matlab\extern\examples\cppmath\msvc 下的工程文件msvc42.mak,选project->settings->C/C++->code generation 为Debug Multithread Dll选项,Build即可。

(2)把VC的bin目录下的vcvars32.bat拷贝的C盘根目录下运行msconfig将vcars32.bat添加的Auoexec.bat中去。

重新启动计算机。

回到MS_DOS方式下在matlab\extern\include运行

lib /def:libmat.def /machine:ix86 /out:libeng.lib

lib /def:libmatlb.def /machine:ix86 /out:libmatlab.lib

lib /def:libmmfile.def /machine:ix86 /out:libmmfile.lib

lib /def:libmx.def /machine:ix86 /out:libmx.lib

 

不论是方式(1)还是(2),生成的libmx.lib libmatlb.lib libmmfile.lib libmat.lib文件都要拷贝到c:\matlab\extern\lib(也就是添加到VC的编译路径中去)。

本文中的文件路径可能跟读者计算机中的路径有所不同,请参照修改

转载于:https://www.cnblogs.com/hjqxaly/archive/2010/10/25/1860320.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值