MATLAB结合C/C++建立独立的应用程序
作者: CodeHunter
MATLAB提供了丰富的数学函数库,再加上MATLAB本身的工具箱函数,以及丰富的第三方开发的工具箱函数,大大降低了我们处理复杂数学运算模型时的难度。
开发商业软件时,如果应用了MATLAB的函数库,必定使我们的开发效率大大提高,同时MATLAB函数库的高效率性、可维护性、可扩展性正好适应商业软件的开发需求。
但是在我们发布商业软件时不可能给每个使用者安装上一套MATLAB,那要付出极其昂贵的代价,到底怎样用MATLAB建立独立的应用程序呢?下文将结合简单的实例具体而微得阐述两个可供选择的方法。
本文将以Windows 2000 作为开发平台,Borland C++ Builder6(以下简称BCB)作为开发工具,结合MATLAB6.1来阐述MATLAB函数的应用。
1 准备工作
MATLAB为开发软件提供了一个开发人员工具箱,使用它提供的函数库,就能够开发出我们自己的程序。建立MALTLAB和BCB的开发环境是我们首要完成的工作。
1.1 MATLAB所提供的函数库的架构
首先我们要了解MATLAB的函数库的架构如图1.1,这样我们才能够清楚的知道,我们即将调用的函数来自哪里。
User Code
MATLAB M-File Math Library
MATLAB API Library
MATLAB Math Build-In Library
MATLAB Utility Library
ANSI C Library
MATLAB Graphics Library
MATLAB函数库的架构(图1.1)
1.2 安装配置开发环境
第一步:安装MATLAB6.1。
安装完成之后你就会得到开发所必需的文件。在<matlab>\extern目录下就是我们开发需要用到的Library和头文件。表1.2显示了开发所用到的目录及其作用对照表。
目录
作用
<matlab>\extern\include
C头文件
<matlab>\extern\include\cpp
C++头
<matlab>\extern\lib\win32\Borland
针对各个版本的BCB所提供的lib文件
<matlab>\extern\lib\win32\microsoft
针对各个版本的MS Visual C++所提供的lib文件
<matlab>\extern\examples
MATLAB提供的例子
目录及其作用对照表1.2
注: 如果你用的bcb6可以使用<matlab>\extern\lib\win32\borland\bc54下面的lib文件
第二步:配置bcb的开发环境。
假设你已经安装完了MATLAB6.1和BCB,然后打开Project Options 对话框,在Directories/Conditionals面板中的Include Path里面增加<matlab>\extern\include这个路径,Libray path里面增加<matlab>\extern\lib\win32\borland这个路径。然后新建一个项目,并将如下文件加入到项目中去。
<matlab>\extern\lib\win32\borland\bc54\libmatlb.lib
<matlab>\extern\lib\win32\borland\bc54\libmatlbmx.lib
<matlab>\extern\lib\win32\borland\bc54\libmex.lib
<matlab>\extern\lib\win32\borland\bc54\libmmfile.lib
<matlab>\extern\lib\win32\borland\bc54\libmx.lib
如果用到了图形函数则还要把下面两个文件加入到项目中去。
<matlab>\extern\lib\win32\borland\bc54\sgl.lib
<matlab>\extern\lib\win32\borland\bc54\libmwsglm.lib
2 开发项目
经过上面的一番准备,我们已经有了一个开发环境,下文将给出两个简单的例子来阐述如何调用C Math函数和ToolBox及M文件里面定义的函数。
2.1 C Math函数的使用方法
新建一个控制台程序,主程序如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "matlab.h" /*必要的头文件*/
int main()
{
double num1, num2;
mxArray *volatile factors1 = NULL; /* 必须定义指向maArray的指针*/
mxArray *volatile factors2 = NULL;
mxArray *volatile common_factors = NULL;
mlfEnterNewContext(0,0); /* 开启自动内存管理的功能*/
printf("Enter a number: ");
scanf("%lf", &num1);
printf("Enter a second number: ");
scanf("%lf", &num2);
mlfTry /* 用于捕获错误信息 */
{
mlfAssign(&factors1, mlfFactor(mlfScalar(num1))); /*mlfScalar函数将num1转换成maArray,然后调用mlfFactors生成num1的素数因子*/
mlfAssign(&factors2, mlfFactor(mlfScalar(num2)));
mlfAssign(&common_factors, /* 将factors1和factors2的交集复制到common_factors数组中 */
mlfIntersect(NULL, NULL, factors1, factors2, NULL));
if (mlfTobool(mlfIsempty(common_factors))) /* 如果没有公因子*/
printf("%0.0lf and %0.0lf are relatively prime\n",
num1, num2);
else
{
printf("%0.0lf and %0.0lf share common factor(s):",
num1, num2);
mlfPrintMatrix(common_factors);
}
} /* end mlfTry */
mlfCatch/* 将捕获的错误显示*/
{
mlfPrintf("In catch block: \n");
mlfPrintMatrix(mlfLasterr(NULL));
}
mlfEndCatch
mxDestroyArray(factors1); /* 释放掉由mlfAssign所申请得maArray数组 */
mxDestroyArray(factors2);
mxDestroyArray(common_factors);
mlfRestorePreviousContext(0,0); /* 关闭自动内存管理 */
return(EXIT_SUCCESS);
}
编译并运行此程序,运行结果类似如下的输出:
Enter a number: 333
Enter a second number: 444
333 and 444 share common factor(s): 3 37
未完 待续