假设你修改了一个函数,改变了它接受的参数数量和输出数量;你还修改了它的名字以便做好准备。
现在你想要改变对这个函数的所有调用,因为现在数据的结构是不同的,所以每次调用这个函数都会导致错误;如何找到调用此函数的所有位置的列表?这与depfun相反,它给出了一个函数,它列出了文件和其他函数的所有依赖关系;我想要一个依赖于我输入的函数的所有函数的列表。
我查看了个人资料,但项目很大,没有一个独特的入口点可以触及每个文件,所以它并不能让我满意
提前感谢!
答案 0 :(得分:3)
您可以使用半文档化的函数getcallinfo
。
假设您想查看函数spiral
调用函数ceil
的哪一行:
h = getcallinfo('spiral.m');
h.calls.fcnCalls.lines(strcmp(h.calls.fcnCalls.names,'ceil'))
给出
ans =
9 10
由于您希望为整个项目执行此操作,因此您可以遍历文件夹中的所有M文件。此外,getcallinfo
显然返回结构数组,其中数组的每个元素引用不同类型的调用:来自文件中的main函数,来自该文件中的子函数等所以你也需要循环。 (这在上面的示例中没有发生,因为spiral
没有任何子功能。)
所以你可以继续沿着这些方向前进:
fn = 'disp'; % function you want track down
pp = 'path\to\folder'; % project path
d = dir([pp filesep '*.m']); % list M-files in folder. Not recursive
for k = 1:numel(d);
file = d(k).name;
h = getcallinfo(file);
for n = 1:numel(h) % distinguish calls from subfunctions etc
name = h(n).functionPrefix;
lines = h(n).calls.fcnCalls.lines(strcmp(h(n).calls.fcnCalls.names, fn));
if lines
disp(['Function ' fn ' is called by function ' name ' at lines ' num2str(lines)])
end
end
end
这是我的项目的示例输出:
Function disp is called by function matl> at lines 190 198 199 232 257 269 280
Function disp is called by function matl_compile> at lines 32
Function disp is called by function matl_disp> at lines 77 79 81 83
Function disp is called by function matl_help> at lines 10 57 67 69 71 72 74 77
我检查了一些行,结果是正确的。 (你可以自己检查here)。
答案 1 :(得分:0)
如何使用内置的Matlab依赖性分析?
它可以在同一文件夹中显示功能的父级,但遗憾的是无法显示其他文件夹的依赖项。如果这是一个问题,那么您可能希望从父文件夹中查找所有子函数,然后继续查看.m文件的引用位置。
要运行报告,请右键单击"当前文件夹中的空白区域"窗格,在“报告”下,您将找到“依赖关系报告”。
(当然,如果你有Linux / Cygwin,那么你可以使用find和grep:
find . -name "*.m" -exec grep -l "function" {} \;
其中function是您已更改的.m文件)
答案 2 :(得分:0)
可能无需更改对该函数的所有调用,您只需重新定义旧函数即可调用已修改的函数。例如,修改后的函数只接受原始函数的a,c参数:
function [result1, result2] = old_fcn (a,b,c,d)
[result1, result2] = modified_fcn(a(1:2), c');
end