打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
matlab和vc混合编程
举一个实际的例子来说明如何在vc中调用matlab函数
1、首先打开matlab,建立一个简单的m文件,内容如下:
function [sum, prod] =test(x,y)
sum = x+y;
prod = x*y;
该函数里面有一个函数:test(x,y),准备在vc里面调用该函数。该函数有两个
输入参数x和y,分别是两个矩阵,两个输出参数sum和prod,分别是x+y和x*y.
2、在matlab中用mcc命令将test.m编译成c程序:
        mcc -t -L C test.m
        这样会在test.m目录下生成两个文件:test.h和test.c
3、建立一个win32 console的工程,工程里面只有一个文件(作为示例),内容如下:
#include <stdio.h>
#include <stdlib.h>     /* used for EXIT_SUCCESS */
#include <string.h>
# include "test.h"
#include "matlab.h"
static double data1[] = { 1, 2, 3, 4};
static double data2[] = { 7, 8, 9, 10};
int main()
{
    /* Declare two matrices and initialize to NULL */
    mxArray *mat0 = NULL;
    mxArray *mat1 = NULL;
    mxArray *mat2 =NULL;
    mxArray *mat3 = NULL;
    /* Enable automated memory management */
    mlfEnterNewContext(0, 0);
    /* Create the matrices and assign data to them */
    mlfAssign(&mat0, mlfDoubleMatrix(2, 2, data1, NULL));
    mlfAssign(&mat1, mlfDoubleMatrix(2, 2, data2, NULL));
    /*  matlab进行编译的时候,函数名字前面会加上一个mlf,比如
                Test<-->mlfTest
                另外,对于两个返回参数的情形,matlab用这样的形式来实现:
                mxArray * mlfTest(mxArray * * prod, mxArray * x, mxArray * y)
                也既通过传递参数实现给一个参数赋值,通过返回值给matlab程序中
                需要返回的最后一个变量赋值      */
        mlfAssign(&mat2, mlfTest(&mat3,mat0,mat1));
    /* Print the matrices */
        puts("\nmat0=");
    mlfPrintMatrix(mat0);
        puts("\nmat1=");
    mlfPrintMatrix(mat1);
        puts("\nmat0+mat1=");
    mlfPrintMatrix(mat2);
        puts("\nmat0*mat1=");
    mlfPrintMatrix(mat3);
    /* Free the matrices */
    mxDestroyArray(mat0);
    mxDestroyArray(mat1);
    mxDestroyArray(mat2);
    mxDestroyArray(mat3);
    /* Disable automated memory management */
    mlfRestorePreviousContext(0, 0);
    return(EXIT_SUCCESS);
}
4、将test.c 和test.h拷贝到上面示例代码的工程目录下面,在vc左侧的工程窗口上的
   Source Files上点击右键,选择Add Files to folder,然后添加test.c,然后同样的
   方法添加test.h
5、设置项目编译选项
       首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单:
     Project->Settings->C/C++
     Category:  Preprocessor
     Preprocessor definitions:  添加: MSVC,IBMPC,MSWIND(添加这些宏可以防止
                                出现strstream.h找不到的错误)
     Category:  Precompiled Headers
         选择:  Automatic use of precompiled headers
                Through header: stdafx.
6、调设置项目连接选项
     首先要从下面几个函数定义文件(*.def)生成相应的导入库文件(*.lib)
        libmmfile.def
        libmatlb.def
        libmx.def
        libmat.def
        libmex.def
    它们位于目录:matlab安装的目录\extern\include
    用下面命令(在命令行下面首先进入matlab的extern\include目录下,
    然后运行下列命令)导出库文件:
      lib /def:libmmfile.def /out:libmmfile.lib /machine:ix86
lib /def:libmatlb.def /out:libmatlb.lib /machine:ix86
      lib /def:libmx.def /out:libmx.lib /machine:ix86
lib /def:libmat.def /out:libmat.lib /machine:ix86
如果用到图形库(sgl)的话:
lib /def:libmex.def /out:libmex.lib /machine:ix86
    将生成的所有.lib文件拷贝到工程目录下,然后加入你的项目连接选项
     Project->Settings->Link
     Category:Input
     Object/library modules:
     添加: libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmex.lib
注1: 中间是空格,不要加逗号
注2: libmatpm.lib是C++ MathLib的库,如果是只用C,就不用连接它了。
7、设置编译环境
7、设置编译环境
    Tools->Options->Directories
    Include fiels添加:
        c:\matlab\extern\include
        c:\matlab\extern\include\cpp
    Library fiels添加:
        c:\matlab\extern\lib
        c:\matlab\extern\include
这样就可以编译运行了,需要注意的是test.m中的函数function[sum,prod]=test(x,y)
经过编译,变成了如下的形式:
mxArray * mlfTest(mxArray * * prod, mxArray * x, mxArray * y)
该程序运行后的结果如下(图):                                                                           
                                                                                                                       
                                                        
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
VC++和Matlab(转)
vc对.mat文件的读取
VC++如何利用Matlab2014b的图形引擎进行绘图
C++读写.mat文件
VC调用matlab中定义的.m文件中的函数的实例
Visual Studio创建Matlab mex(dll)函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服