前一段时间在工作中遇到这样一个实际问题,项目主体部分是用C++写的,但其中有一小部分算法是用MATLAB写的。于是乎,我第一想法是如何用C++把MATLAB中的代码实现出来。
这时,一位前辈语重心长地和我说:“可以去网上找一下MATLAB Coder。”
当时听完一脸懵逼,什么是MATLAB Coder?它有什么用?
于是在网上查阅了一些资料之后,发现MATLAB Coder实际上是MATLAB自带的一个应用程序。这个应用程序的牛X之处在于它可以直接将MATLAB代码转换成C/C++代码。
就在我以为使用MATLAB Coder可以轻松地转换时,但是在实际使用过程中依然遇到一些雷区,这些雷区是在网上查不到。
为了防止小伙伴继续“踩雷”,今天详细地讲解一下如何使用MATLAB Coder将MATLAB代码转换成C/C++代码?如何避免一些“雷区”?
01 | 准备工作
在使用MATLAB Coder前,我们需要先对MATLAB代码进行一些处理,主要包括:
(1)删除MATLAB代码中所有的注释(这是第一个“雷区”,必须要把MATLAB代码中注释全部删干净,否则无法成功转换)。
(2)删除MATLAB代码中画图和打印部分的代码,简而言之,就是把什么plot、disp之类的代码全部删除掉。如果不删除这些代码,则会导致无法成功转换,这是第二个“雷区”。
(3)如果在MATLAB代码中想要把一个未知行(列)数的数据储存在矩阵中,常规的做法是先令这个储存的矩阵A为空。
假设要添加的若干行数据,每次添加的数据都为B。然后可以用如下的代码将要添加的数据添加进来。
这其实是最容易忽视的一个“雷区”,C/C++不允许你MATLAB存在这么牛X的方法,因此如果MATLAB代码中存在上述类型添加数据的代码,那么是无法成功转换的。
解决方案:先求出究竟需要添加多少行数据?然后再添加数据。
假设经计算需要添加m行数据,且添加数据的列数都为n,那么可以先初始化储存的矩阵A,然后再通过计数器的方式循环添加数据。
02 | 封装主函数
因为主函数为脚本函数,在转换之前需要先将脚本函数转换为一个常规的函数,即有明确输入和输出的函数。
以遗传算法(GA)求解旅行商问题(TSP)MATLAB代码讲解这篇推文的主函数为例,原来主函数的代码如下:
封装之后的主函数如下:
03 | 新建一个脚本函数
在封装完主函数后,删除掉原来的脚本函数GA_TSP。再新建一个脚本函数TEST,在这个脚本函数中给出封装后的主函数的输入数据,具体代码如下:
04 | 开始转换
这里我们已经将注释、画图和打印部分的代码全部删除完毕。
STEP1:点击MATLAB Coder
STEP2:添加封装后的GA_TSP函数。
STEP3:根据提示修改代码
这里我们将OX函数进行修改,修改后的OX函数代码如下:
STEP4:重复前3步操作,在STEP2点击NEXT后,直接来到定义输入变量类型这一步。
STEP5:检验运行环境
发现又报错了,按照要求修改OX函数,这次报错的原因是OX函数代码中的第10行和第11行,这两行代码是常见的第三个“雷区”,修改后的OX函数如下:
继续重复前几步到STEP5,又发现了新的报错。
报错信息是C中if语句中的条件不能像MATLAB这么写,于是对Mutate函数做出一些修改,修改后的函数如下:
再一次重复前几步到STEP5,这一次终于成功了。
STEP6:点击Gnerate生成C代码,在MATLAB代码文件夹下多了2个文件和1个文件夹,转换出的C代码在codegen文件夹->lib文件夹->GA_TSP文件夹下。
至此,使用MATLAB Coder应用程序成功将遗传算法(GA)求解旅行商问题(TSP)MATLAB代码讲解这篇推文的MATLAB代码转换为C代码。
知乎 | bilibili:随心390
长按识别关注我们