在matlab

时间:2016-09-14 16:13:37

标签: matlab debugging dependencies

假设你修改了一个函数,改变了它接受的参数数量和输出数量;你还修改了它的名字以便做好准备。

现在你想要改变对这个函数的所有调用,因为现在数据的结构是不同的,所以每次调用这个函数都会导致错误;如何找到调用此函数的所有位置的列表?这与depfun相反,它给出了一个函数,它列出了文件和其他函数的所有依赖关系;我想要一个依赖于我输入的函数的所有函数的列表。

我查看了个人资料,但项目很大,没有一个独特的入口点可以触及每个文件,所以它并不能让我满意

提前感谢!

3 个答案:

答案 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依赖性分析?

http://uk.mathworks.com/help/matlab/matlab_prog/identify-dependencies.html?searchHighlight=identify%20program%20dependencies

它可以在同一文件夹中显示功能的父级,但遗憾的是无法显示其他文件夹的依赖项。如果这是一个问题,那么您可能希望从父文件夹中查找所有子函数,然后继续查看.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