Matalb在循环处理方面确实不如C++高效,所以有时候我们希望这些部分通过C++实现,以下介绍两种常用方法
1. 调用控制台程序
1.1 编写控制台程序
这个应该比较简单,使用VC或者VS创建一个控制台程序(Win32 Console Application)。
主函数如下:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
// argc – arguments’ count 参数个数
// argv – arguments’ values参数值
// envp – enviromental parameter环境参数
// 获取输入参数string1、string2
string sParm1 = __argv[1];
string sParm2 = __argv[2];
……
}
1.2 使用dos命令或者system命令调用
[status,cmdout] = dos(command)
[status,cmdout] = dos(command,'-echo')
[status,cmdout] = system(command)
[status,cmdout] = system(command,'-echo')
dos和system函数的语法一样,当需要程序运行过程中需要用户输入时加上‘-echo’即可,command为dos命令,例如调用myFun.exe,输入参数分别为string1、string2,則编写方式如下:
command = [‘myFun.exe ’ sting1 ‘ ’ string2];
使用这种方式调用控制台程序,一般不显示命令窗口,期间matlab处于进程运转状态,等控制台程序执行完成后,matlab命令行窗口会返回控制台程序的输出结果,方可执行后续命令。
若想令控制台窗口显示,可在command命令最后加“&”字符,Matlab调用程序后会立刻返回,控制台程序独立运行。
command = [‘myFun.exe ’ sting1 ‘ ’ string2 ‘&’];
2. 使用Mex函数
2.1 环境配置:
a)不需要调试:准备matlab,TDM-GCC编译软件
软件下载及配置参见网页:
https://blog.csdn.net/weixin_42660579/article/details/97389224
步骤为:
- ① 下载对应版本
- ② 安装并设置环境变量
- ③ matlab下mex -setup部署验证
编写完函数后,将所有文件放到一个文件夹下去,在matlab中设置工作路径为此文件夹,使用mex ***.cpp,完成编译后直接调用即可,64位对应生成文件为**.mexw64。
b)需要调试:准备matlab,visual studio软件
Matlab中使用mex -setup命令若找不到vs可核查vs中有没有安装c++配置,或许你的matlab在vs之后安装也可能出现找不到的情况,试试重装vs的c++环境吧(如下图,使用modify模式就可以),然后在matlab里使用:mex -setup -v 查找编译环境。
其他配置参考网页:https://zhuanlan.zhihu.com/p/59998696
注意:需要重新替换mex文件或者重新调试时,需要先clear *.mex64一下。
2.2 Mex函数编写
参考网页:https://www.cnblogs.com/Key-Ky/p/4233581.html
注意:函数中所有动态分配地址(new)需要及时释放(delete),不然会出现意想不到的奔溃,有时会崩溃有时会正常的那种。
3、缺憾
我本来打算用C++实现一段功能,同时能在matlab中查看进度那样,但尝试各种方法以后效果貌似都不理想,Mex函数中的printf信息倒是可以显示在matlab命令窗口,但也只限于数据特别大的情况,一般也就像dos命令一样,可以看到函数调用后卡住不动,完成后一下显示所有屏幕输出信息。
不过通过这次尝试,总算把Matlab调用C++的几种方式摸了一下吧,其他项目可以使用。