举一个实际的例子来说明如何在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)
该程序运行后的结果如下(图):