1  变量声明与参数传递

1)接口文件的输入输出参数,应该尽量避免cell或者table等c语言中不能转换或者没有对应的变量类型。

2)在m文件中,变量的类型与占用空间需要在使用前开辟。

3)应该尽量避免行列都不确定的变量的出现。如果必须出现不确定大小的变量,应该尽量使用行向量、列向量或者行、列向量组合进行代替。

4)在函数的运行过程中,应避免变量类型发生改变的过程。

5)对于主函数与子函数的参数传递,应该对于传参维度或者类型进行定义,如使用coder.Varsize等对于变量进行限制,避免coder在推导的过程中误判参数类型,从而引发的各种错误

2  函数的转换与改写

1)部分函数没有对应的自动转换方法,部分函数需要在特定参数环境下方能自动转换。这些函数需要避免使用或者手工改写。

在代码转换的过程中,需要修改或者被禁止使用的函数范围,请参阅

同时,在每一个函数的说明页面底部的扩展说明中,也会配有相关解释或者链接。请自行参阅。

2)子函数应写成单独的文件,不应在同一个文件中编写多个函数。

3)部分函数如果之前已经被改写过,可以根据函数需求进行使用。如下表:

f146b6c8290a

3  代码生成与逻辑推导

1)在使用coder进行代码生成的时候,应当在添加接口文件的界面中加入尽可能多的子函数文件,并给予充分的参数设定。这样可以避免coder对于参数传递时的误判,不仅可以减少错误地产生,也可以提高文件生成后运行时的占用空间与运行速度。即若有文件A.m,与B.m。其中A调用了B,那么在coder中应当将A与B均手动加入生成过程。

2)Coder生成代码的时候,会对所有的函数及操作过程进行逻辑推导,如果发现在操作过程中有分支覆盖不完全的情况,将会报错。故需要在逻辑判断或者数学计算前,保证考虑到了参数的所有可能数值。

3)进行逻辑判断前,需要检查参与比较的变量维度是否相同。若某些特定情况会发生变量维度不同的情景,在代码生成中可能会报错。其修正方式一般有两种,第一种,在发生变量维度变化前,使用新的判断语句,保证逻辑判断的变量维度相同;第二种,使用repmat,reshape等语句,在逻辑判断前,固定参与判断的变量维度(在对代码有充分了解的前提下,建议使用第二种)。

4  编译须知

1)在coder进行代码生成的时候,需要占用一定量的硬件资源,一般matlab默认占用的硬件资源不会超过计算机硬件配置的1/4,如果参与生成的文件数量较多,或者逻辑关系较为复杂,可能出现out of memory错误。此时的一种办法是需要用opts文件对默认设置进行覆盖。这种方法的步骤如下:

①设你的matlab安装目录为$matlab,则找到目录$matlab/bin/win64(32位系统为$matlab/bin/win32)。

②新建名为java.opts的文件(新建方式任意,比如文本文档即可)。

③通过记事本打开java.opts文件。

④在文件中键入字段-Xmx8192m。在该字段中8192m是你允许的最大使用空间,8192即8g内存。该值可以根据需求定制。需要注意的是,由于每个人的JAVA版本不同,命令可能有差异,请参考相关资料。

⑤查询java版本的方式是:version -java。查询当前可以使用的最大内存空间的命令为:java.lang.Runtime.getRuntime.maxMemory。查询命令可以在matlab命令行窗口使用。

2)关于代码生成时的错误,普遍原因是matlab代码推断时发生了变量维度不一致或者类型不一致的错误。此时可以通过coder的IDE进行查看,将鼠标移动至变量处,即可显示该变量推断的维度与类型,若发生推断类型与设计类型不同的情形,即需要对变量进行限定等操作。具体修改方式,参考3中内容。

5  Linux打包要点

打包的过程往往并不是一帆风顺的,在so打包的过程实践中,可能会碰到以下问题。报错示例如图所示:

f146b6c8290a

这个时候可以采取以下步骤尝试:

1)点击下图中红圈部分菜单,查看报错的信息。

f146b6c8290a

2) 复制棕色的部分,注意这条信息可能很长,请注意赋值完整。

3) 打开终端,将当前路径设置至so文件的生成目录(m工程所在路径\codegen\dll\自定工程名称\)。

4) 在linux终端窗口粘贴复制的命令。然后在命令末端添加-fopenmp。回车即可生成成功。如果提升出错,尤其是提示命令不能被解析,很可能是在复制的时候不小心拷贝了/t,/n等标识,将末尾的空白删除,手动键入“空格-fopenmp”。

f146b6c8290a

6  python封装对照

打包完成之后,打开dll同目录下的.h文件,文件内容如图所示:

f146b6c8290a

图中棕色圈内的是调用dll的方法名,红色划线标注的是变量类型,在python中,使用ctype包,将python变量类型转换成c语言变量类型。Python中的封装方法如下:

f146b6c8290a

其中非基本变量类型的初始化方法如下:

f146b6c8290a

ctypes与C语言转换对照表如下:

f146b6c8290a

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐