我正在尝试为大约 500 个 matlab src 文件创建一个函数调用图。我找不到任何可以帮助我对多个 src 文件执行相同操作的工具。
有人熟悉任何工具或插件吗?
如果没有任何此类工具可用,欢迎任何关于阅读 6000 行没有文档的 matlab 代码的建议。
我正在尝试为大约 500 个 matlab src 文件创建一个函数调用图。我找不到任何可以帮助我对多个 src 文件执行相同操作的工具。
有人熟悉任何工具或插件吗?
如果没有任何此类工具可用,欢迎任何关于阅读 6000 行没有文档的 matlab 代码的建议。
我建议研究使用该depfun
函数来构建调用图。有关详细信息,请参阅http://www.mathworks.com/help/techdoc/ref/depfun.html。
特别是,我发现depfun
使用'-toponly'
参数调用,然后迭代结果,是手动构建调用图的好方法。不幸的是,我不再能够访问我使用它编写的任何代码。
我认为你的意思是你想看看你的代码是如何运行的——哪些函数调用了哪些子函数,它们运行的时间和时间是多少?
看看MATLAB Code Profiler。按如下方式执行您的代码:
>> profile on -history; MyCode; profile viewer
>> p = profile('info');
p
包含函数历史记录,来自我上面链接的同一个帮助页面:
历史数据描述了在执行过程中进入和退出函数的顺序。该命令在它返回的结构的字段中
profile
返回历史数据。FunctionHistory
历史数据是一个 2×n 数组。第一行包含布尔值,其中0
表示进入函数和1
退出函数。第二行通过其在FunctionTable
字段中的索引标识正在进入或退出的函数。此示例 [下] 读取历史数据并将其显示在 MATLAB 命令行窗口中。
profile on -history
plot(magic(4));
p = profile('info');
for n = 1:size(p.FunctionHistory,2)
if p.FunctionHistory(1,n)==0
str = 'entering function: ';
else
str = 'exiting function: ';
end
disp([str p.FunctionTable(p.FunctionHistory(2,n)).FunctionName])
end
您不一定需要像上面的示例那样显示入口和出口调用;只需查看p.FunctionTable
并p.FunctionHistory
足以显示代码何时进入和退出函数。
我同意 m2html 的回答,我只想说以下 m2html/mdot 文档中的示例很好:
mdot('m2html.mat','m2html.dot');
!dot -Tps m2html.dot -o m2html.ps
!neato -Tps m2html.dot -o m2html.ps
但我在导出为 pdf 时运气更好:
mdot('m2html.mat','m2html.dot');
!dot -Tpdf m2html.dot -o m2html.pdf
此外,在您尝试上述命令之前,您必须发出如下内容:
m2html('mfiles','..\some\dir\with\code\','htmldir','doc_dir','graph','on')
我发现 m2html 非常有用(与 Graphviz 软件结合使用)。但是,就我而言,我想创建包含在文件夹中的程序的文档,但忽略了一些子文件夹和 .m 文件。我发现,通过在 m2html 调用中添加“ignoreddir”标志,可以使程序忽略一些子文件夹。但是,我没有找到用于忽略 .m 文件的模拟标志(“ignoreddir”标志也没有完成这项工作)。作为一种解决方法,在 m2html.m 文件的第 1306 行之后添加以下行允许使用“ignoreddir”标志来忽略 .m 文件:
d = {d{~ismember(d,{ignoredDir{:}})}};
因此,例如,要生成文件夹“program_folder”中包含的程序的 html 文档,但忽略“subfolder_1”子文件夹和“test.m”文件,应该执行如下操作:
m2html( 'mfiles', 'program_folder', ... % set program folder
'save', 'on', ... % provide the m2html.mat
'htmldir', './doc', ... % set doc folder
'graph', 'on', ... % produce the graph.dot file to be used for the visualization, for example, as a flux/block diagram
'recursive', 'on', ... % consider also all the subfolders inside the program folders
'global', 'on', ... % link also calls between functions in different folders, i.e., do not link only the calls for the functions which are in the same folder
'ignoreddir', { 'subfolder_1' 'test.m' } ); % ignore the following folders/files
请注意,“program_folder”中所有名为“subfolder_1”的子文件夹和所有名为“test.m”的文件都将被忽略。