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