Это не полностью автоматический и использует полудокументированную функцию getcalliinfo
, но, возможно, это может помочь.
От help getcallinfo
:
GETCALLINFO Returns called functions and their first and last lines
This function is unsupported and might change or be removed without
notice in a future version.
Рассмотрим пример этого функции, который использует несколько наборов инструментов и содержит локальную функцию:
function y = example(x)
a = sinc(2);
b = example_local_function(pi);
c = @xcorr;
d = c([1 2 3], [4 5 6]);
y = imdilate(x,[1 1; 1 1]);
end
function z = example_local_fun(t)
z = t.^2 + exprnd(1);
end
Сохранение этой функции в файл example.m
и запуск getcallinfo
дает
>> getcallinfo('example.m')
Name Type Starts Ends Length Full Name
---- ---- ------ ---- ------ ---------
example function 1 7 7 example
example_local_fun subfunction 9 11 3 example>example_local_fun
ans =
1×2 struct array with fields:
type
name
fullname
functionPrefix
calls
firstline
lastline
linemask
В результате получается массив struct с двумя записями: первая для главной функции и вторая для локальной функции.Обратите внимание на первую запись:
>> t(1)
ans =
struct with fields:
type: [1×1 internal.matlab.codetools.reports.matlabType.Function]
name: 'example'
fullname: 'example'
functionPrefix: 'example>'
calls: [1×1 struct]
firstline: 1
lastline: 7
linemask: [11×1 logical]
Вызванные функции находятся в
>> t(1).calls
ans =
struct with fields:
fcnCalls: [1×1 struct]
innerCalls: [1×1 struct]
dotCalls: [1×1 struct]
atCalls: [1×1 struct]
В частности, в этом случае единственными двумя непустыми структурами являются
>> t(1).calls.fcnCalls
ans =
struct with fields:
names: {'sinc' 'example_local_function' 'pi' 'imdilate'}
lines: [2 3 3 6]
>> t(1).calls.atCalls
ans =
struct with fields:
names: {'xcorr'}
lines: 4
Чтобы увидеть, где определены вызываемые функции, вы можете применить which
к каждой из ячеек в массиве ячеек, содержащихся в поле names
:
C:\Program Files\MATLAB\R2018b\toolbox\signal\signal\sinc.m
'example_local_function' not found.
built-in (C:\Program Files\MATLAB\R2018b\toolbox\matlab\elmat\pi)
C:\Program Files\MATLAB\R2018b\toolbox\images\images\imdilate.m
Чтобы автоматизировать процесс, вам нужно знать имя папки панели инструментов (это легко увидеть из вашей установки Matlab).Например, для набора инструментов для обработки изображений это 'images'
(или вы можете предпочесть использовать полный путь, чтобы избежать ложных срабатываний):
>> s = cellfun(@which, t(1).calls.fcnCalls.names, 'UniformOutput', false);
>> ind = ~cellfun(@isempty, regexp(s, 'images', 'once'));
>> t(1).calls.fcnCalls.names(ind)
>> t(1).calls.fcnCalls.names(ind)
ans =
1×1 cell array
{'imdilate'}
Процедура аналогична для других наборов инструментов.Например, папка панели инструментов обработки сигналов называется 'signals'
:
>> s = cellfun(@which, t(1).calls.fcnCalls.names, 'UniformOutput', false);
>> ind = ~cellfun(@isempty, regexp(s, 'signal', 'once'));
>> t(1).calls.fcnCalls.names(ind)
ans =
1×1 cell array
{'sinc'}
Аналогично, для других типов вызовов:
>> s = cellfun(@which, t(1).calls.atCalls.names, 'UniformOutput', false);
>> ind = ~cellfun(@isempty, regexp(s, 'signal', 'once'));
>> t(1).calls.atCalls.names(ind)
ans =
1×1 cell array
{'xcorr'}
Или для локальной функции:
>> s = cellfun(@which, t(2).calls.fcnCalls.names, 'UniformOutput', false)
>> ind = ~cellfun(@isempty, regexp(s, 'stats', 'once'));
>> t(2).calls.fcnCalls.names(ind)
ans =
1×1 cell array
{'exprnd'}