14-matlab编译器

发布于:2021-10-28 06:53:56

MATLAB 程式设计入门篇:通用运算式

MATLAB 程式设计入门篇 MATLAB 编译器
张智星 jang@cs.nthu.edu.tw http://www.cs.nthu.edu.tw/~jang 清大资工系 多媒体检索实验室

MATLAB 程式设计入门篇:通用运算式

14-1 MATLAB编译器简介
MATLAB编译器具有下列功能:
产生独立应用程式(Stand-alone Applications)
应用程式能够具有MATLAB的完整功能 可以在没有安装 MATLAB的电脑上执行

产生C或C++的程式库:
含动态程式库(Dynamically Linked Libraries,简称 DLL,用於微软视窗系统)或共享程式库(Shared Libraries,用於UNIX/LINUX系统) 可用於任何外部应用程式 可以在没有安装 MATLAB的电脑上执行

MATLAB 程式设计入门篇:通用运算式

14-1 MATLAB编译器简介
软体元件:
例如 Java 类别库(Java Classes),Excel 增益程式( Excel Add-ins),COM 及 .NET 物件等,这些软体元件 的产生 需要使用 MATLAB Builder

MATLAB 程式设计入门篇:通用运算式

14-1 MATLAB编译器简介
进入范例说明前,必须先设定电脑上的C编译 器,以便用於MATLAB编译器,方法如下述
在MATLAB命令视窗下输入「mbuild -setup」,系 统回应如下:
Please choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers [y]/n?

MATLAB 程式设计入门篇:通用运算式

14-1 MATLAB编译器简介
输入「y」之后,按下 Enter,系统回应如下:
Select a compiler: [1] Lcc C version 2.4.1 in C:\PROGRAM FILES\MATLAB\R2006A\sys\lcc [2] Microsoft Visual C/C++ version 8.0 in C:\Program Files\Microsoft Visual Studio 8 [3] Microsoft Visual C/C++ version 6.0 in C:\PROGRA~1\MIAF9D~1 [0] None Compiler:

这些C编译器是MATLAB在你的电脑自动侦测出来的 结果(所以在不同的电脑会得到不同的结果)

MATLAB 程式设计入门篇:通用运算式

提示
若在上述过程中,出现错误讯息,你可以先进 行「mex -setup」,再进行「mbuild -setup 」,可能就可以解决你的问题.

MATLAB 程式设计入门篇:通用运算式

14-2 产生独立应用程式
若要MATLAB编译器将一个MATLAB函式编译成独 立应用程式,所使用的指令是 mcc,格式如下
mcc –m userFunc.m

先撰写一个 MATLAB 函式myEigValue.m
范例14-1:myEigValue/myEigValue.m
function eigValue = myEigValue(mat) %myEigValue: Generate the eigenvalues of the given matrix if (isstr(mat)) % 若输入是字串,转成数值 mat=eval(mat); end [a, b] = eig(mat); eigValue=diag(b); disp(eigValue); % 显示固有值 eigenValue

MATLAB 程式设计入门篇:通用运算式

14-2 产生独立应用程式
测试此范例,可以在MATLAB命令视窗输入:
myEigValue(magic(5));

即可在萤幕显示一个 5X5 的魔术方阵所对应 的固有值

MATLAB 程式设计入门篇:通用运算式

提示
在将此MATLAB函式编译成为可执行档的过程中 ,会产生一些额外档案,所以你必须将本范例 由光碟拷贝至硬碟,才能进行以下的操作.

MATLAB 程式设计入门篇:通用运算式

14-2 产生独立应用程式
将 myEigValue.m 转换成 myEigValue.exe, 有一些细节要特别小心:
myEigValue.exe 将使用命列列参数的方式来得到 输入方阵,所以 myEigValue.m 必须先使用 eval 将输入字串转为方阵. myEigValue.m 必须使用 disp 结果印在萤幕上, 以方便 myEigValue.exe 来印出同样的结果.

MATLAB 程式设计入门篇:通用运算式

14-2 产生独立应用程式
接著,我们在MATLAB命令视窗下,将工作目录 改变至 myEigValue.m 所在的目录 然后使用下列命令来将 myEigValue.m 编译成 myEigValue.exe,如下:
mcc –m myEigValue.m

经过半分钟的时间,就会完成编译,并产生数 个档案,包含 一个可执行档 myEigValue.exe 若要测试此可执行档,可以直接在 DOS 命令 视窗下输入:
myEigValue.exe magic(5)

MATLAB 程式设计入门篇:通用运算式

14-2 产生独立应用程式
即可在萤幕显示一个 5X5 的魔术方阵所对应 的固有值 若要输入一个特定的方阵,可以使用类双引号 来包住代表方阵的字串,范例如下:
myEigValue.exe "[1 2 3; 3 2 1; 1 1 1]"

MATLAB 程式设计入门篇:通用运算式

提示
在第一次执行 myEigValue.exe时,会产生 myEigValue_mcr 目录,以便使用MATLAB的程 式库,所以花的时间会比较久一点.之后再执 行 myEigValue.exe,就会直接取用速度就会 变快了.

MATLAB 程式设计入门篇:通用运算式

14-2 产生独立应用程式
使用 mcc 时,还有几点要注意:
如果你的 MATLAB 函式有呼叫任何你自己定义的函 式,要一并放进来编译. 如果只是要产生C程式码,而不产生可执行档,可 以使用「mcc –mc myEigValue.m」 (c 代表只产 生 C 语言的包装程式档案). 如果要检视MATLAB编译器在编译时所产生的讯息, 可以使用「mcc –mv myEigValue.m」(v 代表 verbose). 如果你的函式没有用到绘图功能,可以使用「mcc –m –R –nojvm myFunc.m」,以减小所产生的档 案大小.

MATLAB 程式设计入门篇:通用运算式

14-2 产生独立应用程式
若要将编译后所产生的可执行档案搬到其他电 脑上执行,必须将下列档案放在一起,才能顺 利执行:
myEigValue.exe myEigValue.ctf

myEigValue.ctf 用来记录各种资讯,让 myEigValue.exe在第一次执行时,可以产生 myEigValue_mcr目录 mcr代表MATLAB Compiler Runtime,用来存放 myEigValue.exe会取用到的MATLAB程式库

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
使用MATLAB编译器可以产生共享程式库( Shared Libraries),包含所有由使用者定义 的函式,以便让其他独立应用程式来呼叫. 产生一个共享程式库.首先先定义这两个 MATLAB 函式
范例14-2:sharedLibrary/myMatMultiply.m
function out = myMatMultiply(mat1, mat2) %myMatEig: Generate the product of two given matrices out=mat1*mat2;

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
范例14-3:sharedLibrary/myMatInv.m
function invMat = myMatInv(mat) %myMatInv: Generate the inverse matrix of the given matrix invMat=inv(mat);

接著将这两个 MATLAB 函式编译成共享程式库 ,程式库名称为 matLib,所使用的指令如下
mcc -B csharedlib:matLib myMatInv.m myMatMultiply.m

此时会在工作目录下产生数个档案,主档名都 是 matLib,这些档案即是 matLib 程式库

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
可以使用一般独立应用程式来呼叫这个程式库 内所定义的函式. 程式库是由两个 MATLAB 函式编译所得,因此 我们可以得到两个对应的C函式,分别是 mlfMyMatInv 及 mlfMyMatMultiply,对应关 系如下:
out=myMatInv(in) mlfMyMatInv(1, &out, in); out=myMatMultiply(in1, in2) mlfMyMatMultiply(1, &out, in1, in2);

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
使用 matLib 程式库来呼叫这两个C函式的独 立应用程式范例如下
范例10-4:myMatLibMain.c
/*========================================= ========== * 此范例程式可以呼叫 MATLAB 编译器所产生的程式库 matLib * Roger Jang, 20080211 *========================================= =========*/ #include <stdio.h> #include "matLib.h" /* 显示C资料型态为 mxArray 的双倍精准阵列 */ void matDisplay(const mxArray* in){

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
int i, j; int rowNum = mxGetM(in); int colNum = mxGetN(in); double *data = mxGetPr(in); 倍精准资料 */ /* 横列个数 */ /* 直行个数 */ /* 指到输入阵列中的双

/* 印出资料 */ for(i=0; i<colNum; i++){ for(j=0; j<rowNum; j++) printf("%4.2f\t", data[j*colNum+i]); printf("\n"); } printf("\n"); } /* 主要工作函式 */ void *mainFunction(int *errorCode){

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
mxArray *in1, *in2; /* 定义送到程式库函式的输入矩阵 */ mxArray *out = NULL; /* 定义程式库函式的输出矩阵 */ double data[] = {1, 3, 5, 2, 4, 6, 0, 8, 9}; /* 测试用的资料 */ /*确认此应用程式已经被正确*羰 */ if(!mclInitializeApplication(NULL, 0)){ fprintf(stderr, "错误:无法启始应用程式!\n"); *errorCode=-1; return; } /*确认程式库matLib已经被正确*羰 */ if (!matLibInitialize()){ fprintf(stderr,"错误:无法启始程式库!\n"); *errorCode=-2; return;

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
} /* 创造输入矩阵 */ in1 = mxCreateDoubleMatrix(3, 3, mxREAL); in2 = mxCreateDoubleMatrix(3, 3, mxREAL); /* 将 data 中的资料拷贝至 in1 */ memcpy(mxGetPr(in1), data, 9*sizeof(double)); /* 将 data 中的资料拷贝至 in2 */ memcpy(mxGetPr(in2), data, 9*sizeof(double)); /* 呼叫由 MATLAB 编译器产生的程式库 matLib 中的函式 */ /* 计算矩阵相乘 */ mlfMyMatMultiply(1, &out, in1, in2); printf("矩阵相乘的结果:\n"); matDisplay(out); mxDestroyArray(out); out=NULL; /* 收回配置给 out 的记 忆体 */

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
/* 计算反矩阵 */ mlfMyMatInv(1, &out, in1); printf("计算反矩阵的结果:\n"); matDisplay(out); mxDestroyArray(out); out=NULL; /* 收回配置给 out 的记 忆体 */ /* 收回配置给 in1 和 in2 的记忆体 */ mxDestroyArray(in1); in1=NULL; mxDestroyArray(in2); in2=NULL; /* 呼叫 matLibTerminate() 以终止应用程式库 */ matLibTerminate(); /* 呼叫 mclTerminateApplication() 以终止此应用程式 */ mclTerminateApplication(); }

MATLAB 程式设计入门篇:通用运算式

14-3 产生共享资料库
/* 主程式 */ int main(){ int errorCode=0; mainFunction(&errorCode); return(errorCode); }

若要编译此独立程式,可在 MATLAB 命令视窗 输入如下:
mbuild myMatLibMain.c matLib.lib

此时即可产生独立应用程式 myMatLibMain.exe,只要在 DOS 命令视窗下 输入「myMatLibMain」,即可看到此程式码执 行的结果.


相关推荐

最新更新

猜你喜欢