发布时间:2025-12-09 14:39:51 浏览次数:4
如何将MATLAB程序发布为独立的不依赖MATLAB环境可执行的程序包(基于MatlabR2015b版)
关键字:MatlabR2015b,可独立运行,可脱离Matlab环境,m文件,Matlab程序
如何将MATLAB程序m文件发布为独立的不依赖MATLAB环境可执行的程序包。本文演示了基于Matlab R2015b版的实际 *** 作步骤。
应用背景:写好的Matlab程序要交给别人使用,但是对方机器上没有安装Matlab软件,要求对方安装Matlab也不太现实。因此必须发布成可执行的软件包才能在对方的机器上运行。
打开Matlab2015,在菜单卡中选择“APPS”,如下图所示:
单击上图中右侧的下拉三角形按钮,滚动下拉框窗口右侧的垂直滑动条,如下所示。
找到APPLICATIONDEPLOYMENT这一栏,选择第一个图标“ApplicationCompiler”,打开它,如下所示界面。
如果下拉列表中没有这个APPLICATIONDEPLOYMENT的话,可能是没有安装此组件。请通过添加Addons的方式,或者利用Matlab的安装程序安装。
在打开的Application Compiler窗口中,注意勾选“Runtimeincluded in Package
MyAppInstaller_mcr
788MB",这样的话生成的可执行程序包就能独立运行,默认是上一个选项表示在脱离MATLAB环境的机器上运行时需要联网下载所需的运行时动态链接
库,这样不好,万一对方没有网络,或者网络很慢呢?所以还是直接将所有Matlab运行时库打包过去比较好。如果对方的机器上已经有了这个运行时库,则可
以将这两个钩选项都去掉。
然后,单击上图中的”Add
mainfile“,选择所需打包的m文件。如果此m文件还需要调用其他的m文件,请在下面的"Addtionalinstaller
Options"栏下的”Filesrequired for your application to run“中的+号按钮去添加。
还可以设置应用程序的名称、作者、软件描述、启动时显示的等信息。
然后按照提示next就可以得到最后的应用程序安装包。
最后在Matlab的当前工作文件夹的相应路径(此处C:\Workspace4Matlab)的相应路径下生成的最后的可单独运行的安装包exe文件,如下图所示。
这个MyAppInstaller_mcrexe文件就是最后的成品。
将这个可执行文件在对方的机器上双击运行,会进入安装界面,按照提示 *** 作,非常简单,即可安装成可执行软件,安装过程当然会自动在对方的机器中安装我们已打包在此安装包中的Matlab运行时库。然后就能只能直接运行安装后的程序了。
上述\standaloneMatlabProg路径下还有for_testing子目录,这个目录中有个一成品的测试版,你可以双击运行看看效果。
上面的胸台说的差不多,我是用以下方法实现的:
Matlab引擎采用客户和服务器计算方式,在运用中,Vc的C语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,它提供了下列几个函数:
engOpen,
engGetArray,
engPutArray,
engEvaString,
engOutputBuffer
,engClose与客户机进行交互。
下面例程是在Vc下建一个基于对话框的应用程序,在对话框中设置一个Button控件OnMatlabEngine,在对话框
cpp文件中加入”engineh”
和“mathh”
头文件,下面给出部分程序清单。
Void
CtestmatlabDlg::OnMatlabEngine(){
Engine
ep;
mxArray
T=NULL,result=NULL,mFs=NULL,mnfft=
NULL;
double
datax[1024];
char
buffer[1024];
for(int
j=0;j<1024;j++)//注:如通过采集卡采集数据可将采集的数据放在datax[]数组中,此循环就不需要
{
double
samt=(double)(10/1024);
datax[j]=sin(20630samt31415926+11531415926);
}
double
pPxx,pFxx;
if(!(ep=engOpen("
\0"))){//打开Matlab引擎,建立与本地Matlab的连接
fprintf(stderr,"\n
Can't
start
MATLAB
engine\n");
exit(-1);
}
double
Fs[1]={1024};//因为Matlab所有参与运算的参数都是矩阵的形式,因而下列几行将参数转变
double
nfft[1]={1024};//成Matlab可接受的矩阵形式。
T=mxCreateDoubleMatrix(1,1024,mxREAL);
mnfft=mxCreateDoubleMatrix(1,1,mxREAL);
mFs=mxCreateDoubleMatrix(1,1,mxREAL);
mxSetName(T,"T");
mxSetName(mnfft,"mnfft");
mxSetName(mFs,"mFs");
memcpy((char)mxGetPr(T),(char)datax,
1024sizeof(double));
memcpy((char)mxGetPr(mnfft),(char)nfft,
sizeof(double));
memcpy((char)mxGetPr(mFs),(char)Fs,1sizeof(double));
engPutArray(ep,T);
//将转化的参数放入引擎中,此时可在Matlab
command窗口下查看此参数
engPutArray(ep,mnfft);
engPutArray(ep,mFs);
engEvalString(ep,"[pxx,fo]=psd(T,mnfft,mFs);");
//利用引擎执行工具箱中文件
engOutputBuffer(ep,buffer,512);
//如只想看显示图形,可将返回参数去掉,psd无返回参数缺省情况下会自动画图形
result=engGetArray(ep,"pxx");//取出引擎中的数据放在所指的区域中供后续处理
pPxx=mxGetPr(result);
result=engGetArray(ep,"fo");
pFxx=mxGetPr(result);
engEvalString(ep,"plot(fo,10log10(pxx));");//利用引擎画图
engEvalString(ep,"title('功率谱分析');");
engEvalString(ep,"xlabel('Hz');");
engEvalString(ep,"ylable('db');");
mxDestroyArray(T);
//释放内存
mxDestroyArray(mFs);
mxDestroyArray(mnfft);
mxDestroyArray(result);
engEvalString(ep,"close;");
engClose(ep);
}
上述程序在Vc下编译需要将
libengdll和libmxdll两个动态库利用以下的命令:
lib/def:<自己的Matlab的安装路径,下同>e:\
Matlab\extern\include\def
/machine:ix86
/out:lib来生成程序所需的静态连接库libenglib和libmxlib,将libenglib和libmxlib所在的目录加入Vc++
project/link/object/library
modules下即可。
M文件是保存一段代码的文件,类似于C语言中的一个函数体; 这也是MATLAB中最常见的文件保存格式之一 MEX文件是一种“可在matlab环境中调用的C(或fortran)语言衍生程序”。也就是说,MEX文件的源码文件是由C或Fortran语言编写的,后经matlab编译器处理而生成的二进制文件;它可以被matlab解释器自动装载并执行的动态链接程序,这种文件在windows下是ddl文件。
mat是matlab的数据存储的标准格式。也就是你 *** 作产生的数据的一个集合包,可以把一次处理的结果保存,供下一次使用。
你可以调用matlab的子程序库,用c或fortan调用mat格式的数据。有几种方法可以打开1matlab中可以用load命令读取mat文件
2C语言中有API读取mat文件,如matOpen, matClose等等
3用记事本就可以打开mat文件,mat文件格式是公开的,你可以自己解析里面的内容
首先说定义的函数可能在调用时出现问题,原因是函数的输入部分PLOT在其中并没有使用,再者输出参数应包括M和N,因此函数定义部分应该改为function [Hist, RGBt,M,N] = getImageHists(imageName)。
在执行完Hist = Hist / (MN),执行如下语句完成数据保存
save histsmat Hist
接着可以执行 clear all
并执行 load histsmat Hist
及whos
以验证数据存储是否成功