代码之家  ›  专栏  ›  技术社区  ›  Benjamin Oakes

如何在Matlab中可视化项目结构?[关闭]

  •  52
  • Benjamin Oakes  · 技术社区  · 15 年前

    我拥有数千行的Matlab代码,一些as>900行函数和一些目录 function_name.m 文件夹。很难弄清楚每件事都在做什么(或与之相关),也很难弄清楚依赖关系。您建议如何可视化函数结构,例如从哪个函数调用哪些函数,以及按什么顺序调用?

    7 回复  |  直到 11 年前
        1
  •  42
  •   ptomato    15 年前

    港口到纽比。

    (开玩笑)

    通常在Matlab中,有些文件是作为函数编写的,有些是作为脚本编写的。脚本做一些事情,比如加载您想要处理的数据,并将其提供给函数,并绘制图表。

    为了组织工作,我将从顶层脚本开始,找出哪些函数执行加载、绘图、处理等操作。将脚本保存在顶层目录中,并根据函数的用途,尝试将这些函数分离到子目录中。将函数的依赖项放入同一子目录中。尝试使目录中的代码不依赖于父目录(或堂兄弟目录)中的任何内容。

    每当你弄清楚一个函数做什么和它的参数是什么时,写一个doc注释。

    这假设编写代码的人是合理的。如果不是这样,Matlab可以很容易地将所有内容都放到一个目录中,并使所有内容都依赖于一个摇摇欲坠的代码塔中的其他内容,因此您可能最终会进行大量重构。

        2
  •  14
  •   Jonas    15 年前

    你的代码有合适的帮助文本吗?在这种情况下, m2html 这将是一个很好的帮助,因为它允许您创建链接的HTML帮助,方便浏览。

    此外,它还允许您生成依赖关系图,这有助于您进一步了解如何组织代码。

        3
  •  13
  •   MatlabDoug    15 年前

    我在MathWorks的各种工作中,不得不多次处理这个问题。这就是我为大量的Matlab代码所做的:

    1. 退后,也许两次!
    2. 全选,按ctrl-i键进行智能缩进
    3. 全选,ctrl-j换行注释

    4. 如果我觉得是纸质的-打印出所有文件,并获得一组高亮-手动跟踪,突出显示长期变量和重要的函数调用。

    ~~~和/或~~~

    5如果我觉得幸运,开始在调试器中运行代码,逐步完成 一次一行(进入用户编写的子函数)

    在这一点上,我可以通过一个典型的流程来控制结构。我可能不知道每件事都做些什么,但我对正在发生的事情有一个很好的想法。

    通常,我的目标是找到一个bug,解决它并继续前进。你的目标可能完全不同。这是我用来快速理解我多年来发送的大量不同的Matlab代码的方法。

        4
  •  7
  •   Matthew Simoneau Pär Wieslander    14 年前

    MATLAB Programming Style Guidelines 理查德约翰逊是一个很好的资源。

        5
  •  7
  •   Ursa Major    14 年前

    关于Matlab编码约定的几点建议:

    1. 使用addpath避免文件混乱并帮助函数taxnomony

    2. 对于函数脚本或条件运行的集合,这也有助于插件/输出模块和重用或代码引用。

    3. 使用配置文件打开和关闭选项

    4. 对结构的体系结构设置以及工作方式有一个概述
    5. 保留状态/自述文件(将自己视为新用户,如何帮助将其作为新用户自己模块的一部分或解决方案的一部分无缝地进行吸收?如果你在3个月后又回到代码中,感觉丢失或无法跟踪-有问题。)我的建议是:记日记,以完善你对维护巧妙项目的想法。不断完善你的艺术!
    6. 对于公式,请使用LaTex作为文档(并将其保存在附近一个名为“文档”的文件夹中,确保它们易于访问和跟踪-如果必须在驱动器上使用“搜索”,则项目管理有问题)
    7. 将代码分解为简短的本地化模块和简短的代码,使用较少的滚动,代码将更容易跟踪。
    8. 使用有意义的变量和函数名(Java样式看起来不错,例如“BACKEDUPDATAF验证”),不要吝啬地缩短单词,以后会受到影响。
    9. 在设计中,重新考虑是否应该使用函数、脚本或oo(面向对象)
    10. 不要急于过早优化,因为速度Matlab不是最佳选择。如果您真的必须这样做,请保留一个非优化版本,以便进行端到端的可读性比较,故障排除和调试将是一个不小的诅咒。
    11. 总是,总是,总是评论你的代码。不要以没有时间为借口,你以后会浪费更多的时间。
    12. 为了区分,考虑为代码修改设置一个新节点,例如设置一个树来区分版本。

    13. 为输入/输出、图像、中间结果等使用单独的文件夹。

    14. 使用时间戳跟踪您的版本

    15. 与其他人共享您的代码,如果他们发现很难维护、使用或修改,请重新考虑如何优化您的构建。

        6
  •  3
  •   High Performance Mark    15 年前

    我同意大多数关于Matlab不太支持现代软件源代码结构的评论,但是我不认为用一点规则来强制使用你自己的结构太难了。

    将源文件组织到一个目录层次结构中,就像用另一种编程语言编写的任何程序的源文件一样。你不需要坚持等级制度,如果你愿意的话,选择你自己的结构。使用setpath命令(或者不管它叫什么)告诉Matlab在工作时在哪里查找M文件。

    熟悉MatlabProfiler工具,它可以给你提供调用图(不是非常图形化,更像是GProf的调用图),这有助于破译意大利面代码。

    当然,我们所有的m文件都在存储库中,我们从中服务它们。我们在一个网络驱动器上保留了一个专用工具箱,所有用户都可以直接调用工具箱中的“已发布”代码。

        7
  •  3
  •   Andrew Janke    15 年前

    备份一切正常。创建原始源代码树的原始tarball,然后将其全部放入源代码管理中,以便跟踪和回滚更改。

    看看Matlab的depfun()和depdir(),它们检测静态依赖项。它可以帮助您了解Matlab函数之间的依赖关系。使用所有文件上的“depfun-topoly”和少量的字符串咀嚼,您可以构建一个立即依赖项列表,并将其放入graphviz文件中,以生成代码库调用连接的大有向图。图中的集群可能是划分代码的好地方。(编辑:请参阅jonas的解决方案;看起来m2html是为您这样做的。)

    如果您有很大的自由重写代码,可以考虑将一些代码重写为对象,使用带有类方法和私有函数的无状态实用程序类作为将相关函数打包在一起并提供一些封装的方法。我用这种方式组织了大量的Matlab代码库,它工作得很好。在经典的Matlab中,类是执行某种程序包的唯一方法。我相信Matlab新的OO系统也支持名称空间。

    如果不想将代码转换为oo,可以在子目录中组织相关函数。这至少有助于组织源代码浏览。

    所有函数都应该有一些标准帮助文本格式的doco,包括h1行。如果他们没有,就把你在那里学到的东西贴上评论。然后使用“contentsrpt”工具自动生成类或目录的目录文件。

    祝你好运。