我已经拥有数千行Matlab代码,有些作为> 900行函数和一些充满function_name.m
文件的目录。很难弄清楚一切正在做什么(或与之相关)或找出依赖关系。您可以建议将函数结构可视化,例如从哪个函数调用哪些函数以及按什么顺序调用?
答案 0 :(得分:44)
Port to NumPy。
(笑话。)
通常在Matlab中,您将一些文件编写为函数,一些文件作为脚本编写。脚本执行的操作包括加载要处理的数据,并将其提供给函数,并对其进行绘图。
要组织一些事情,我将从顶级脚本开始,找出哪些函数进行加载,绘图,处理等。将脚本保存在顶级目录中,并尝试将这些函数分离到子目录中,根据功能的目的。将函数的依赖项放入同一子目录中。尝试使目录中的代码不依赖于父目录(或表兄弟目录)中的任何内容。
每当你弄清楚函数的功能及其参数是什么时,写一个doc注释。
这假设编写代码的人是合理的。如果没有,Matlab可以很容易地把所有东西都放到一个目录中,让所有东西都依赖于摇摇晃晃的代码塔中的其他东西,所以你最终可能会进行大量的重构。
答案 1 :(得分:14)
您的代码是否附带了不错的帮助文字?在这种情况下,m2html将是一个很好的帮助,因为它允许您创建链接的HTML帮助以便于浏览。
此外,它允许您创建依赖图,这有助于您更好地了解组织代码的方式。
答案 2 :(得分:13)
我在The MathWorks的各种角色中不得不多次处理这个问题。这就是我为MATLAB代码所做的大事:
全选,Ctrl-J包装评论
如果我感觉基于纸张 - 打印出所有文件,并获得一组荧光笔 - 手动关注,突出显示长期变量和重要的函数调用。
~~~ AND / OR ~~~
5如果我感到幸运,请开始在调试器中运行代码,逐步完成 一次一行(进入用户编写的子功能)
此时,我可以通过控制结构跟踪典型的流程。我可能不知道一切都做了什么,但我对正在发生的事情有一个很好的了解。
通常,我的目标是找到一个错误,解决它并继续前进。你的目标可能完全不同。这是我用来快速理解多年来发送的不同MATLAB代码片段的方法。
答案 3 :(得分:7)
MATLAB Programming Style Guidelines是一个很好的资源。
答案 4 :(得分:7)
关于Matlab编码约定的一些建议:
使用addpath避免文件混乱并协助函数taxnomony
分解功能脚本的section_或为条件运行设置,这也有助于插件/输出模块和重用或代码引用。
使用配置文件打开和关闭选项
为了区分,考虑为代码修改设置一个新节点,例如。设置树以区分版本。
使用单独的文件夹输入/输出,图像,中间结果等。
使用时间戳跟踪您的版本
与其他人分享您的代码,如果他们发现难以维护,使用或修改,请重新考虑如何优化您的构建。
答案 5 :(得分:3)
我同意大多数关于Matlab的评论不是非常支持现代软件源代码结构,但我不认为用一点纪律强加你自己的一些结构太难了。
将源文件组织到目录层次结构中,就像使用其他编程语言编写的任何程序的源文件一样。您不需要坚持层次结构,如果您愿意,可以选择自己的结构。使用setpath命令(或其他任何命令)告诉Matlab在工作时查找m文件的位置。
熟悉Matlab分析器工具,它可以为您提供调用图(非常图形化,更像是gprof的调用图),这有助于破译意大利面条代码。
当然,我们所有的m文件都在存储库中,我们为此提供服务。我们在其中一个网络驱动器上保留了一个私有工具箱,所有用户都可以直接在该工具箱中调用“已发布”的代码。
答案 6 :(得分:3)
支持一切是正确的。创建原始源树的原始tarball,然后将其全部放入源代码控制中,以便跟踪和回滚更改。
查看Matlab的depfun()和depdir(),它们检测静态依赖项。它可以帮助您查看Matlab函数之间的依赖关系。通过对所有文件进行“depfun -toponly”和一些字符串修改,您可以构建一个直接依赖项列表,并将其放入GraphViz文件中,以生成代码库调用连接的大型有向图。图中的集群可能是划分代码的好地方。 (编辑:参见Jonas的解决方案;看起来像m2html为你做这个。)
如果你有足够的自由来重写代码,可以考虑将一些代码重写为对象,使用带有类方法和私有函数的无状态实用程序类作为将相关函数打包在一起并提供一些封装的方法。我使用过这种方式组织的大型Matlab代码库,它可以正常工作。在经典的Matlab中,类是你做某种包的唯一方法。我相信Matlab的新OO系统也支持命名空间。
如果您不想将代码转换为OO,则可以在子目录中组织相关功能。这有助于组织它至少进行源代码浏览。
所有功能都应该有一些matlab的标准帮助文本格式,包括H1行。如果他们不这样做,请将评论贴在你在那里学到的东西上。然后使用“contentsrpt”工具自动生成类或目录的目录文件。
祝你好运。