MATLAB和VC连,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

#include      /* used for EXIT_SUCCESS */

#include

# 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,比如

TestmlfTest

另外,对于两个返回参数的情形,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)

该程序运行后的结果如下(图):

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值