精华内容
下载资源
问答
  • VC调用matlab函数

    2021-04-21 03:01:04
    最近在学习matlab,先试一个VC调用matlab函数的简单例子用的是VC++6.0,matlab7.8也就是matlabR2009首先在matlab下设置环境>> mbuild -setupPlease choose your compiler for building standalone MATLAB ...

    最近在学习matlab,先试一个VC调用matlab函数的简单例子

    用的是VC++6.0,matlab7.8也就是matlabR2009

    首先在matlab下设置环境

    >> mbuild -setup

    Please choose your compiler for building standalone MATLAB applications:

    Would you like mbuild to locate installed compilers [y]/n?        y

    Select a compiler:

    [1] Lcc-win32 C 2.4.1 in F:\MATLAB\R2009a\sys\lcc

    [2] Microsoft Visual C++ 6.0 in F:\VC++6.0

    [0] None

    Compiler: 2

    Please verify your choices:

    Compiler: Microsoft Visual C++ 6.0

    Location: F:\VC++6.0

    Are these correct [y]/n?   y

    Done . . .

    >> mex -setup

    Please choose your compiler for building external interface (MEX) files:

    Would you like mex to locate installed compilers [y]/n? y

    Select a compiler:

    [1] Lcc-win32 C 2.4.1 in F:\MATLAB\R2009a\sys\lcc

    [2] Microsoft Visual C++ 6.0 in F:\VC++6.0

    [0] None

    Compiler: 2

    Please verify your choices:

    Compiler: Microsoft Visual C++ 6.0

    Location: F:\VC++6.0

    Are these correct [y]/n? y

    Done . . .

    **************************************************************************

    **************************************************************************

    1.然后设置系统路径。我的电脑->属性高级->环境变量->系统变量->Path选项,增加以下路径

    C:\MATLAB7\extern\include:

    C:\MATLAB\extern\lib\win32\microsoft\msvc60;

    C:\MATLAB\bin\win32

    ps: 使用时换成自己电脑上对应matlab的路径

    2.做一个简单的M函数。文件名和函数名一致。

    //文件名plot_test.m

    function plot_test(result)

    plot(result) %画图

    3.在命令窗口敲deploytool(以前是comtool,在matlab7.8版本上没有这个命令),新建一个Comonent工程

    怎么设置都在链接上看得到。

    4. 单击Project Files->Add File 添加plot_test.m文件

    5.单击Bulid,编译连接该组件。在你matlab工程文件夹下会有distrib和src两个子文件夹。在src下plot_idl_i.c,有关于com和

    com接口GUID。其中CLSID在VC中需要用到

    6.打开VC,创建一个单文档MFC工程文件。命令plot。创建两个menu消息,一个获得接口指针,另一个画图

    7.打开类向导。在Add Class,选中From a typed library ,进入C:\MATLAB\work\plot\src文件夹,选中plot_idl.tlb

    文件。

    8.在CplotApp的InitInstance()中

    BOOL suc = AfxOleInit();  //初始化OLE

    if (suc == FALSE)

    {

    ::AfxMessageBox("初始化OLE失败");

    }

    其次 在CplotView中包含plot_idl.h math.h头文件。并定义常量PI,并从src下plot_idl_i.c中拷贝类GUID并复制到plotView.h

    文件中

    #include "test_matlabDoc.h"

    #include "test_matlabView.h"

    #include "test_idl.h"

    #include "math.h"

    #define PI 3.14169265

    const CLSID CLSID_Test = {0x37604F6E,0xE76B,0x4490,{0x8D,0x5D,0x3B,0x40,0xD1,0xF9,0xAD,0xE9}};

    ITest plot;

    //ps:文件名取名不同,换成自己对应的即可

    void CTest_matlabView::OnDrawPic()

    {

    // TODO: Add your command handler code here

    //画图

    const int N = 100;

    double a[N];

    double f = 50;

    double Ts = 0.002;

    for (int i = 0; i < N; i++)

    {

    a[i] = sin(2*PI*f*i*Ts);

    }

    VARIANT x;

    VariantInit(&x);

    x.vt = VT_ARRAY|VT_R8;

    SAFEARRAYBOUND rgsabound[1];

    rgsabound[0].cElements = N;

    rgsabound[0].lLbound = 0;

    x.parray = SafeArrayCreate(VT_R8, 1, rgsabound);

    SafeArrayLock(x.parray);

    x.parray->pvData = a;

    plot.plot_test(x);

    SafeArrayUnlock(x.parray);

    }

    void CTest_matlabView::OnInitOle()

    {

    // TODO: Add your command handler code here

    //初始化ole

    plot.CreateDispatch(CLSID_Test, NULL);

    COleDispatchDriver();

    }

    展开全文
  • VS调用Matlab函数.docx

    2019-07-19 17:21:02
    将Matlab的.m文件生成动态链接库,然后在VS的工程项目中调用动态链接库。可以完美实现VC调用Matlab函数
  • 今天把基于DLL形式VC调用MATLAB函数的主要过程写下,在后续将写一下MATLAB调用VC函数的方法。1,MATLAB中编译DLL在MATLAB中写好函数,保存在mtTestFun.m中,使用mcc -W cpplib:mtlibTestFun -T link:...

    如果在一MATLAB中或VC中写好了函数的话,想在对方的环境中使用,直接将对方语言的函数编译成DLL是一个很方便的方法,不需要重写了。今天把基于DLL形式VC调用MATLAB函数的主要过程写下,在后续将写一下MATLAB调用VC函数的方法。

    1,MATLAB中编译DLL

    在MATLAB中写好函数,保存在mtTestFun.m中,使用mcc -W cpplib:mtlibTestFun -T link:lib mtTestFun.m生成DLL,用这个命令生成的是C++形式的,即MATLAB数据类型可以用类;否则用其他的命令生成的C形式的,不能用类。并生成了相应的其他mtlibTestFun.h,mtlibTestFun.lib和mtlibTestFun.dll在内的一些文件

    2,VC中引用MATLAB环境

    需要引用的.h文件路径为MATLAB安装目录的ExternInclude,需要引用的.lib文件路径为MATLAB安装目录的ExternLibWin32Microsoft;引入附加库mclmcrrt.lib

    3,VC中调用MATLAB函数

    将刚才MATLAB编译生成的文件全拷到当前VC工程下,只将mtlibTestFun.h文件加入到当前工程,并在需要调用的文件中包含;引入附加库mtlibTestFun.lib。在VC初始化函数里用下面函数进行初始化

    mclInitializeApplication(NULL,0);

    mtlibTestFunInitialize();

    在结束时用下面函数释放

    mtlibTestFunTerminate();

    mclTerminateApplication();

    下面在需要的地方调用,假设是下面的形式

    mtlibTestFun(int nargout, mwArray& y, const mwArray& I, const mwArray& th);

    nargout是返回参数个数,这里是1,后面y反演向量则是传出参数,I和th则是传入参数辐射值和切高。

    C++数据传入MATLAB函数时需要将其转化成mwArray类型

    double* pI = new double[row*column];

    pl = ...

    mwArray mwI(row, column, mxDOUBLE_CLASS);

    mwI.SetData(pI, row*column);

    返回后还需要将mwArray转回C++类型数据

    double* pY = new double[Yrow*Ycolumn];

    mwY.GetData(pY, Yrow*Ycolumn);

    当然,对于一维数组数据来说,这样调用是没有问题的,但是对于二维矩阵数据来说,上面的调用会发生数据传入和传出错误。因为C++与MATLAB数组存储顺序不一样,MATLAB是列优先与C++中的行优先不同。这个数据的转换也将在后续给出一些解决办法。

    展开全文
  • VC调用MATLAB函数

    千次阅读 2010-08-20 20:42:00
    通过引擎(Engine)来实现VCMatlab的混合编程。

    Matlab 是由 Math Works 公司于 1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。

     

      但是,由于 Matlab 开发平台的局限性,在其上面开发的程序不能脱离 Matlab 运行环境,因而在处理一些实际应用问题时显得灵活性不足,而 VC++ 则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。

     

       1 Matlab VC 混合编程的实现方法

     

       Matlab 作为控制系统设计的一种通用工具,它可以和 VC 方便的进行连接。一般而言, Matlab VC 混合编程的实现方法主要有以下三种方法:( 1 )通过引擎( Engine , 采用客户机服务器的计算模式,通过 Window ActiveX 通道和 Matlab 进行连接。具体应用时,往往在 VC 中设计程序框架,以编译的程序作为前端客户机;通过调用 Matlab 引擎在后台实现与服务器的连接,实现动态通信( 2 )应用 Matlab 数学函数库, Matlab 中包含了内容丰富的函数库,而且还提供了与 VC 的数学函数接口,用户可以方便的在 VC IDE (集成开发环境)中调用。( 3 )通过 DLL 实现 VC Matlab 的混合编程。 DLL 是一个可执行的二进制文件。把很多通用的功能放在 DLL 中,可以供多个应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享 [2] 。在上述三种方法中,第一种方法对调用 Matlab 的工具箱很实用,所有在进行控制系统的设计和分析时,一般都是通过调用 Matlab 引擎( Engine )来实现的。本文主要介绍采用通过引擎( Engine )来实现 VC Matlab 的混合编程。

     

       2 MATLAB 引擎简介

     

       Matlab 引擎是 Matlab 提供的一系列程序的结合,它允许用户在自己的应用程序中对 Matlab 进行调用,将 Matlab 作为一个操作引擎使用,使其在后台运行。一般 Matlab 引擎采用客户机 / 服务器 (Client/ Sever) 计算方式,就是一种把应用处理负载分布到客户机和服务器上的一种计算模式,客户机和服务器既可以是存在于同一台计算机,也可以通过网络来实现信息共享。一般情况下,客户机是运行前端软件的 PC 机,并且知道如何与服务器通信,服务器与此相对应,是接收请求信息,并采取相应行的机器。由于客户机和服务器共同承担处理负载,使系统总体性能大为提高。在实际应用过程中 , VC C 语言或 C + + 语言的程序作为前端客户机程序 , 它从 Matlab 引擎接收数据信息 , 并与引擎传递命令的数据信息。表 1 是几种常用的 Matlab 引擎调用函数。

      表 1 Matlab 引擎常用调用函数

     

     

     

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

     

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

     

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

     

      ( 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 的安装路径下)。编译环境只需设置一次。

     

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

     

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

     

    #include "engine.h"

    #include <stdlib.h>

     

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

     

     

     

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

     

    根据上面的方法,下面通过一个具体的实力来说明如何实现 VC Matlab 混合编程、它们之间的数据通信以及 VC 环境下对 Matlab 命令的调用。

     

      首先,利用 VC++6.0 MFC 建立一个单文档结构的应用程序,加入一个菜单资源,为其映射相应的功能函数;

     

      其次,根据 Matlab 引擎实现 VC Matlab 的混合编程步骤(见第三部分)为程序设置相应的编译环境并添加连接库函数;

     

      然后,调用 Matlab 的内建函数和命令,主要编写程序代码如下:

     

    最后,添加头文件:

     

    #include "matlab.h" 

     

     

     

      编译运行,就可以得到如(图 1 )所示的结果。

     

    1 调用 Matlab 引擎输出结果

     

      上面例子是 VC Matlab 的混合编程的一个简单应用,在实际的数值计算,控制系统开发等工程应用中,可以很好的利用 VC Matlab 的混合编程技术,从而简化应用程序的开发工作量。

     

     

     

     

     

     

     

    展开全文
  • VC调用matlab函数mclcppMlfFeval重复定义

    千次阅读 2012-04-15 11:10:25
    编译.m文件,生成vc可用的动态连接库和.h头文件,相关数据.c文件,和一个.cpp文件(m_to_cpp.cpp),该.cpp文件中.h文件提供的各个接口的实现,它包括在VC程序中应用matlab连接库时所需的初始化函数,结束时的资源...
    问题背景:
    
    用mcc -W cpplib:libname -T link:lib -v matlab_m_file.m
    编译.m文件,生成vc可用的动态连接库和.h头文件,相关数据.c文件,和一个.cpp文件(m_to_cpp.cpp),该.cpp文件中.h文件提供的各个接口的实现,它包括在VC程序中应用matlab连接库时所需的初始化函数,结束时的资源回收函数,以及由.m文件生成的函数接口等。
    现在我们就可以把生成的这几个文件加到我们的工程中,利用.h文件提供的接口来调用原.m文件中的函数。

    问题描述:
    若自己另写一个源文件(比如main.cpp),因为我们要在其中调用.m文件中函数,所以要include进上述生成的.h文件。
    此时,在编译器链接时会报错:main.obj和m_to_cpp.obj中的mclcppMlfF重复定义
    LNK2005: void __cdecl mclcppMlfF multiply defined

    产生原因:
    究其原因,发现在main.cpp和m_to_cpp.cpp最终都会include一个matlab的头文件mclcppclass.h,而在mclcppclass.h中有mclcppMlfF的实现代码,它是类mwArray的一个友元函数。
    当然在链接的时候会发现两个mclcppMlfF的实现,就会报重复定义错误了。
    http://newsgroups.derkeiler.com/Archive/Comp/comp.soft-sys.matlab/2005-12/msg03204.html
    Maybe the "mclcppclass.h" is not good.(<matlab>\extern\include\)
    First part of this head is the definition of class "mwArray", another
    part is the definition of function "mclcppMlfF". The later is
    the "friend" of the class mwArray.
    When doing some simple examples, it work fine. But if the VC Project
    is complex,-- several .cpp files need to include this head. It often
    make the error :
    "<1>.obj : error LNK2005:
    "void __cdecl mclcppMlfF(void *,char const *,int,int,int,...)"
    (?mclcppMlfF@@YAXPAXPBDHHHZZ) already defined in <2>.obj"

    I solved this problem by dividing this head into two files,defining
    mwArray and mclcppMlfF separately.
    Notice: Don't delete the original "mclcppclass.h". The compile need it.
    (Here, use " mcc -B cpplib:< > < .m>" to generate the C++
    shared library.)

    Another, to generate the C++ shared library, Matlab 7.1 makes
    "LIB_wave1_C_API" and "LIB_wave1_CPP_API " in the <lib>.h. It
    can make the:
    "wave1.lib(wave1.dll) : error LNK2005: "void __cdecl
    wavedetect1(int,class mwArray &,class mwArray const &)"
    (?wavedetect1@@YAXHAAVmwArray@@ABV1@@Z) already defined in wave1.obj"

    If only want to generate the C++ shared library, it's unneccessary to
    generate the "LIB_wave1_C_API" part , I suppose!

    解决办法:
    我的解决办法是:在mclcppclass.h 中添加
    #ifndef OMT_mclcppMlfF
    void mclcppMlfF ...
    ...
    ...
    #endif
    即将函数mclcppMlfF的实现用一个预编译宏包含起来。
    然后在我们自己的源文件(main.cpp)的开始处加上
    #define OMT_mclcppMlfF
    使mclcppMlfF的函数实现不会编译进我们自己的源文件的.obj中
    展开全文
  • 利用VC调用MATLAB函数

    2010-06-04 12:16:08
    本文介绍了在VC曰环境下调用MATLAB6.X提供的数学岸和图形库的方法,实现了在VC刊州环境下脱离MATLAB调用其数据处理和图形显示的功能。
  • 今天把基于DLL形式VC调用MATLAB函数的主要过程写下,在后续将写一下MATLAB调用VC函数的方法。1,MATLAB中编译DLL在MATLAB中写好函数,保存在mtTestFun.m中,使用mcc -W cpplib:mtlibTestFun -T link:...
  • C/C++ VS中调用matlab函数的方法

    万次阅读 热门讨论 2017-07-01 16:20:01
    C/C++ VS中调用matlab函数的方法 Matlab在数值等矩阵运算中具有很大优势,并且Matlab提供了强大的工具箱可以使用,在C/C++开发中,我们可以在VS下调用matlab函数进行混合编程。下面主要介绍VS中调用matlab函数的环境...
  • 在VC++中调用matlab函数

    千次阅读 2016-07-17 19:38:28
    以DLL方式调用M文件中的函数,就是重要的手段。 首先要按帖子Matlab6.1与VC6混合编程小结 (1)中所说的设置编程环境  下面不废话,给出一段例子, :假设有M文件:mfile.m   其中有...
  • vc调用matlab函数

    千次阅读 2007-09-12 11:13:00
    Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱的集成...
  • vc 调用matlab figure 画图

    千次阅读 2016-12-29 15:36:42
    我的环境 matlab7.0, vs2012.执行mex -setup 和mbuild -setup 是选的vc6,vs执行命令的时候不可见 参考1:http://www.ilovematlab.cn/thread-205148-1-1.html ... 调用matlab动态库,
  • C++如何调用matlab函数

    2021-04-20 13:23:19
    C++如何调用matlab函数本来电脑上安装的是matlab2012b,但是好像2012b只有64位的,故重新安装matlab7,安装完注册一下,cmd cd到matlab7的程序目录bin文件夹下,注册 matlab /regserver,就可以调用matlab了,先测试第...
  • vc++调用matlab函数

    千次阅读 2011-02-16 11:30:00
    Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱的集成...
  • 在利用vc++编程时,常需要一些特殊的数学函数,因此可以调用matlab中的强大的数学函数,通常使用的方法有 引擎 和 com 方法。下面对此两种方法进行简单介绍。
  • 现在有两个问题:1,怎么从matlab里传递参数给vc,我使用engGetArray,但是报错,说找不到这个函数,但是我包含了engine.h头文件的2,我在matlab里直接运行那个M文件,可以写文件成功,可是在vc调用matlab引擎去...
  • vs2013调用matlab函数

    2021-04-19 02:07:07
    1、添加matlab环境:在vs2013中vc-directory中添加matlab的excutable 、include、library的directoryInclude:E:\matlab2014\extern\includeLibrary:E:\matlab2014\extern\lib\win64\microsoft然后再linker的input中...
  • VC调用matlab函数

    千次阅读 2010-03-21 13:01:00
    VC调用matlab函数Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。Matlab是一款将数值分析、矩阵计算、信号...
  • VC++调用Matlab编写的DLL(混合编程)

    热门讨论 2011-10-12 15:31:55
    是我的CSDN博客中文章“VC++调用Matlab编写的DLL(混合编程)”的...请先仔细阅读我的CSDN博客中文章“VC++调用Matlab编写的DLL(混合编程)”,再配上该程序,相信会对让你掌握vc和matlab混合编程的基本方法和思想。
  • VC_环境下调用MATLAB方法 在VC_环境下调用MATLAB方法
  • 在C程序中调用Matlab函数的主要过程是:1、调用engOpen函数打开一个Matlab工程2、生成变量矩阵3、调用engPutArray函数将矩阵放入到Matlab工作区间中4、调用engEvalString函数向Matlab传递命令。注意:在VC中,所有和...
  • VC开发与MatLab算法的结合点的关键提点;
  • 软件环境:windows Xp,VC6.0, Matlab 2010b1、编写测试m函数,这个不变,即如下:function [y,z] = myadd2(a, b)% dummy function, just to demonstrate the ideay = a+b;z = a+2*b;end2、运行mbuild -setup设置好...
  • 我用的是VC6与Matlab2011A装饰Matlab代码编译成DLL文件老失败,搞了好久没找到原因,请教各位!以下是网上的算例,照着做了,就是不能初始化DLL。发表于: 2007-10-18 17:35:31 我的开发环境是:Matlab 7.0 和 VC++...
  • Java调用matlab函数接口Java调用matlab函数接口有两种方式:l一种是通过matlab把函数打成jar包;l一种是把matlab编译成dll后,用C++再封装成java能支持的数据类型的dll。注意:不论用这两种方式中的哪一种,最终部署...
  • c++调用matlab函数 - dll方式

    千次阅读 2018-06-09 13:46:57
    项目中遇到一个问题,需要用c++调用matlab程序,这里记录下整个过程。 准备环境 matlab 2014a visual studio 2010 PS:版本问题要注意,之前是visual studio 2017,这个就一直报错(笑cry),matlab比较难安装...
  • 网上搜到一种注册函数的方式,但是用的是老版本的matlab,现在已经没有matlab.hpp这个文件了,"DECLARE_FEVAL_TABLE "这些宏已经没有了~#include "matlab.hpp"#include /***(1) 定义注册函数 ***/mwArray MyFunc...
  • 调用MATLAB函数因为项目需要,前期工作一直在VS2013(编译平台Win32)与MATLAB2014a(64bit)两个平台进行,VS2013用来生成数据,MATLAB2014a用来处理数据,为了简化过程便于应用,想将MATLAB的数据处理程序移植成C++...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,548
精华内容 1,019
关键字:

vc调用matlab函数

matlab 订阅