VC调用MATLAB

http://wangqingyun84.blog.163.com/blog/static/7908361720120325810491/

http://wenku.baidu.com/view/77cdeaa2b0717fd5360cdc32.html

http://www.cnblogs.com/nktblog/archive/2012/04/07/2435624.html   这个博客讲的很好

1. MatlabVC混合编程的实现方法< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

 

Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接.一般而言, MatlabVC混合编程的实现方法主要有以下三种方法:

(1) 通过引擎(Engine),采用C/S的计算模式,通过WindowsActiveX通道和Matlab进行连接.具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;然后通过调用Matlab引擎在后台实现与服务器的连接,实现动态通信.

(2) 使用Matlab数学函数库. Matlab中包含了内容丰富的函数库,而且还提供了与VC的数学函数接口,用户可以方便的在VCIDE中调用.

(3) 通过DLL实现VCMatlab的混合编程.Matlab中的通用功能放在DLL,可以供多个应用程序调用.

在上述三种方法中, 第一种方法对调用Matlab的工具箱很实用,所以在进行控制系统的设计和分析时,一般都是通过调用Matlab引擎来实现的.本文主要介绍采用通过引擎来实现VCMatlab的混合编程.

 

2. MATLAB引擎简介

Matlab引擎是Matlab提供的一系列程序的结合,它允许用户在自己的应用程序中对Matlab进行调用,Matlab作为一个操作引擎使用,使其在后台运行.一般Matlab引擎采用C/S的计算方式,就是一种把应用处理负载分布到客户机和服务器上的一种计算模式,客户机和服务器既可以是存在于同一台计算机,也可以通过网络来实现信息共享.

一般情况下, 客户机是运行前端软件的PC,并且知道如何与服务器通信,服务器与此相对应,是接收请求信息,并采取相应请求的机器.由于客户机和服务器共同承担处理负载,使系统总体性能大为提高.在实际应用过程中,VCC/C++语言的程序作为前端客户机程序,它从Matlab引擎接收数据信息,并与引擎传递命令的数据信息.

通过Matlab引擎用户可以完成以下任务:首先,可以将Matlab作为一个功能强大的和可编程的数学函数库,调用Matlab中的大量的数学计算函数,完成复杂的计算任务;其次,可以为一个特定的任务构建一个完整的系统,前台的用户界面用高级语言编写,后台的计算任务由Matlab引擎来完成;最后,用户不但可以在本地计算机上调用Matlab引擎,而且还可以通过网络调用其它计算机上的Matlab引擎,这样可以很好的实现资源的共享和作业的分工合作.

 

3. Matlab引擎实现VCMatlab混合编程的步骤

  要想在VC集成环境下利用Matlab引擎实现VCMatlab的混合编程,一般需要经过以下几个必要的步骤:

(1) Visual C++6.0 编译环境的设置:通过菜单Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面, Show Directories for下拉列表中选择Include Files,添加路径: D:\Matlab6p5\extern\include(在Matlab的安装路径下);再选择下拉列表中的 Library Files, 添加路径: D:\Matlab6p5\extern\ lib\win32\Microsoft\msvc60(Matlab的安装路径下,在modelsim6.5以上的版本中,没有msv60这个文件,只添加路径到D:\Matlab6p5\extern\ lib\win32\Microsoft即可). 编译环境只需设置一次.  个人理解,类似于quartus和modlesim联合仿真时,在工具里添加modelsim的路径,///

(2) 添加库文件:通过菜单 Projects | settings,进入Link页面,Object/Library Modules框中,添加库文件名: libmx.lib libmat.lib libeng.lib.每个新的工程文件都要单独添加库文件.  ///个人理解:类似于quartus添加test文件

(3) 在使用 engine函数的程序头文件中包含如下两个头文件:

#include "engine.h"

#include <stdlib.h>

(4) 在应用程序中添加调用Matlab引擎的程序代码:

Engine *ep;

if(!(ep=engOpen(" \0"))) //打开Matlab引擎,建立与本地Matlab的连接

{

fprintf(stderr,"\n Can't start MATLAB engine\n");

exit(-1);

}

以上步骤是VCMatlab混合编程的编译环境进行设置,在完成了以上基本步骤后就可以利用Matlab引擎库函数engEvalString来调用Matlab的内建函数了.

 

4. 例子  (仿真成功了)

/*
  过程分析  (不是和本程序完全对应,4.5条没有在程序中体现)
 在C、C++中调用Matlab的主要过程如下所示: 
 1) 首先调用engOpen函数打开一个Matlab工程。 
 2) 生成mxArray。    在Matlab中,所有变量类型,如标量、向量、矩阵、字符串、细胞矩阵和结构,都以mxArrays形式来保存,
 固数据操作都必须通过这些mxArrays来完成。生成mxArray有两种不同的方式。一是用mxCreate函数来创建矩阵,
 之后用mxSetName函数对它进行命名。   另一种方式是选择将一个自定义的数据结构复制到mxArray中,
 值得注意的是Matlab在存储矩阵时是按列序保存的,而在C、C++中是按行序保存的,所以转换时注意分清下标。
 3) 调用engPutArray函数将矩阵放入到Matlab工作区中。   
 4) 通过engEvalString函数向Matlab传递命令,如果成功,函数返回值为此0,否则返回一个非0值。   
 5) 将Matlab中的运行结果回传给C、C++

 */

#include <engine.h>
#include <stdio.h >
#include <string.h>
#include <stdlib.h>
void  main ()

{

Engine *ep;

if(!(ep=engOpen(" \0"))) //调用engOpen函数打开一个Matlab工程

{ fprintf(stderr,"\n Can't start MATLAB engine\n");
 
 exit(-1);
 
}

static double Areal[6]={1,2,3,4,5,6};

mxArray *T=NULL,*a=NULL,*d=NULL;  //生成mxArray

double time[10]={0,1,2,3,4,5,6,7,8,9};

// 利用mx函数库创建矩阵, 传递参数

T=mxCreateDoubleMatrix(1,10,mxREAL);

功能应该是建立m行n列的实双精度矩阵(mxREAL),A为mxArray数据类型。

memcpy((char*)mxGetPr(T),(char*)time,10*sizeof(double));

// 通过上面创建的Matlab Engine连接句柄将参数传递给Server端
//memcpy:void *memcpy(void *dest, const void *src, size_t n);  从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

 

engPutVariable(ep,"T",T);

// 调用Matlab内建的函数和指令,调用engPutArray函数将矩阵放入到Matlab工作区中

engEvalString(ep,"D=.5.*(-9.8).*T.^5;");

engEvalString(ep,"plot(T,D);");
///通过engEvalString函数向Matlab传递命令,如果成功,函数返回值为此0,否则返回一个非0值


}

 

VC中调用Matlab(转) - 青云 - 青云的博客


  

 

 

扩展:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC(Visual C++)是一种编程语言和集成开发环境,可以用于开发各种应用程序。MATLAB是一种数学计算软件,拥有强大的数学函数和算法,可以用于数据处理、数学建模、仿真等领域。 在VC调用MATLAB可以通过以下步骤实现。 首先,需要确保你的计算机上安装了MATLAB软件,并且配置了MATLAB的环境变量。 接下来,在VC的项目中添加MATLAB引擎的相关头文件和链接库,这些文件通常位于MATLAB的安装目录下的extern文件夹中。 然后,可以使用MATLAB引擎提供的函数来调用MATLAB。一般而言,可以使用engOpen函数打开MATLAB引擎,然后使用engEvalString函数执行MATLAB语句,最后使用engClose函数关闭MATLAB引擎。 通过这些函数,可以在VC调用MATLAB的功能,比如计算数学表达式、处理矩阵、执行脚本等。同时,还可以将数据在VCMATLAB之间进行传递,例如将数据从VC传递给MATLAB进行计算,或者将计算结果从MATLAB传递给VC进行后续处理。 需要注意的是,由于VCMATLAB是不同的编程环境,因此调用MATLAB需要一定的编程技巧和经验。在调用MATLAB时,还需要考虑数据类型的转换、错误处理等问题,以确保调用的正确性和稳定性。 总结而言,通过在VC调用MATLAB,可以充分发挥两者的优势,实现更复杂的计算和处理功能。这种方法可以应用于很多领域,如图像处理、信号处理、机器学习等,为开发人员提供了更多的选择和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值