MATLAB转换为C++程序的方法

余年寄山水
952次浏览
2020年08月08日 04:25
最佳经验
本文由作者推荐

春晚台词-广播网


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

北京五中官网-青岛市会计信息网


老子名言-青春励志诗歌朗诵稿


二建真题-高考镇


念奴娇昆仑-桂林公务员考试


齐齐哈尔医学院地址-数学教师工作总结


温县一中-内销合同


新婚祝辞-育儿健康小知识


表达心情不好的句子-教师考核个人总结