MATLAB转换为C++程序的方法
春晚台词-广播网
Matlab 转换为VC++程序
一、
将MATLAB程序或函数打包为可独立运行的exe程序
1.
首先安装支持MATLAB
生成程序运行的动态链接库,路径:
D:
2. 写好.m
程序,一般为函数,可以有输入输出参数
3. 在MATLAB里运行mcc -mv *.m
4. 运行exe程序即可得到结果。
5. 可在命令行中输入参数
二、 在VC++中调用MATLAB计算引擎
1.
将MATLAB注册为COM服务器
在WINDOWS下运行
Matlabregserver
2.
将engine.h
所在的目录加入编译器对头文件的搜索路径上,一般是:
$$MATLABexterninclude,
把引擎函数库所在的目录加入搜索路径,一
般是:
3.
把需要的函数库文件加入到编译所需的额外库文件参数中,文件名为:
; 等
4.
定义引擎变量,并且初始化
Engine* m_ep=NULL;fj
if(!(m_ep=engOpen(
{
AfxMessageBox(
return NULL;
}
hide the command window
engSetVisible(m_ep,0);
5.
构造输入输出参数
mxArray
*mxImage=NULL,*mxResult=NULL;
mxImage=mxCrea
teNumericMatrix(m_nImageWidth,m_nImageHeight,mxUIN
T16_CLASS,mxREAL);
memcpy((short*)mxGetPr(mx
Image),(short*)m_pImageBuffer,m_nBuffSize);
engPutVariable(m_ep,
6.
构造MATLAB命令
engEvalStri
ng(m_ep,
engEvalString(m_ep,
Evaluate the
function of time
CString szStrel;
(
engEvalString(m_ep,szStrel);
engEvalStrin
g(m_ep,
engEvalString(m_ep,
plot the result
engEvalString(m_ep,
engEvalString(m_ep,
7. 接收输出结果
mxResult=mxCreateNum
ericMatrix(m_nImageWidth,m_nImageHeight,mxUINT16_C
LASS,mxREAL);
mxResult=engGetVariable(m_ep,
memcpy((short*)pMorphImage->m_pImageBuffer,(short
*)mxGetPr(mxResult),m_nBuffSize);
8.
销毁MATLAB环境中使用的内存变量
destroy the array
mxDestroyArray(mxImage);
mxDestroyArray(mxResult);
if(ep!=NULL)
engClose(ep);
三、
在VC++中调用MATLAB生成的动态链接库
1.
安装VC++编译器
在Matlab环境下, 输入 mbuild –setup
根据指示配置C++编译器
2. 在MATLAB环境中编译MATLAB函数
mcc
–w cpplib: ***.lib -T link: lib ***.m ***.m
生成的和必须复制到VC程序当前目录下的文件有:***.h ***.lib ***.dll 和
***.ctf
3. 在VC环境调用生成的动态链接库
(a)
初始化应用程序和库(经实验此段必须放在APP的InitInstance()函数
中)
if(!mclInitializeApplication(NULL,0))
{
AfxMessageBox(_T(
return FALSE;
}
else
AfxMessageBox(_T(
if(!LibBraExrInitialize())
{
AfxMessageBox(_T(
return FALSE;
}
else
;AfxMessageBox(_T(
(b) 初始化输入输出参数
定义matlab可以识别的矩阵作为输入和输出
mwArray
mwImage(m_nImageWidth,m_nImageHeight,
mxINT16_CLASS, mxREAL);
a
(m_pImageBuffer,m_nImageWidth * m_nImageHeight);
int nThreshold[1]={0};
mwArray mwThreshold(1,1,mxUINT8_CLASS,mxREAL);
a (nThreshold,1);
(c) 调用MATLAB函数并获得输出结果
DY_FUN_OTSU(1,mwThreshold,mwImage);
a
(nThreshold,1);
(d) 销毁MATLAB使用的环境变量
LibBraExrTerminate();
mclTerminateApplication();
四、
在VC++中调用MATLAB生成的COM组件
1.
安装VC++编译器
在Matlab环境下, 输入 mbuild –setup 根据指示配置C++编译器
2. 在MATLAB环境中编译MATLAB函数
使用dotnettool:创建新工程; 加入M程序; 编译工程; 打包和发布产生的COM组件
产生的DLL文件需要复制到当前程序目录下,如需发布,需要用***.exe程序解压,并执行
3. 在VC环境调用生成的动态链接库
(a)
导入DLL(在stdafx.h文件中)
#import
using
namespace EdgeExtraction;
(b) 初始化和启动COM
CoInitialize(NULL); initialize COM library
hresult=CLSIDFromProgID(OLESTR(
&clsid);
retrieve CLSID of component
IEdgeExtractionclass *t;
hresult=CoCreateIns
tance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IEd
geExtra
ctionclass),(LPVOID *) &t);
if(FAILED(hresult))
{
AfxMessageBox(启动失败!
return NULL;
}
(c)
定义输入输出变量
VARIANT input,
output; 定义输入输出变量
VariantInit(&input);
VariantInit(&output);
VariantInit(&output1);
= VT_I2
|VT_ARRAY;声明输入的类型为VT_ARRAY,Array中的元素为short型
=VT_I2 |VT_ARRAY;
声明输出的类型为VT_ARRAY,Array中的元素为short型
=VT_R8;
=VT_R8;
SAFEARRAYBOUND abound[2];
abound[0].cElements=m_nImageHeight;第一维元素的个数
abound[0].lLbound=0; 第一维矩阵索引的下界
abound[1].cElements=m_nImageWidth;第二维元素的个数
abound[1].lLbound =0;第二维矩阵索引的下界
=SafeArray
Create(VT_I2,2,abound);该函数新建一个SafeArray,并把这个
Sa
feArray的描述符的指针传给。
->pvData=pEdgeImage->m_pImageBuffer;
=SafeA
rrayCreate(VT_I2,2,abound);该函数新建一个SafeArray,并把这个SafeArray的描述符的指针传给。
(d)
调用MATLAB函数
获得输出结果
t->fj_FUN_EdgeExtraction (1,
&output, input); call method
(e)
int
HUGEP* pDest;
SafeArrayAccessData(, (void
HUGEP**)&pDest);
double totalLeft=
double totalRight=
memcpy(pEdgeImage->m_pImageBuffer, pDest,
pEdgeImage->m_nBuffSize); Copy into
array
(f)
销毁MATLAB使用的环境变量
SafeArrayUnaccessData();
SafeArrayDestroy(); destroy the array.
SafeArrayUnaccessData();
SafeArrayDestroy(); destroy the array.
t->Release();
CoUninitialize();
Unintialize the COM library