Как определить, является ли функция встроенной или определяется по имени? - PullRequest
1 голос
/ 22 мая 2019

Я генерирую граф вызовов сложной системы MATLAB и хочу узнать, какие функции встроены, и пометить их.

Ответы [ 4 ]

5 голосов
/ 22 мая 2019

Является ли функция встроенной или нет, легче всего увидеть с помощью команды which.Для данного имени функции отображается полный путь к файлу, который определяет функцию.Например, на моем компьютере

>> which eig
built-in (/Applications/MATLAB_R2018b.app/toolbox/matlab/matfun/eig)
>> which solve
/Users/robert/Documents/MATLAB/cvx/lib/@cvxprob/solve.m  % cvxprob method
>> which nosuchfunctionhere
'nosuchfunctionhere' not found.

говорит мне, что eig является встроенной функцией, а solve - функцией, входящей в пакет cvx, а nosuchfunctionhere -определено нигде.

4 голосов
/ 22 мая 2019

MATLAB делает различие между «встроенными функциями» (т. Е. Не существует M-файл или MEX-файл, код встроен в исполняемый файл MATLAB) и другими функциями, которые являются частью пакета MATLAB, но записаны как M-файлы или MEX-файлы.

Как показал Роберт , функция which сообщит вам, является ли функция "встроенной" или нет, и даст вам путь.

Например, eig является встроенной функцией (указанный путь является файлом, содержащим документацию):

>> p = which('eig')
p =
    'built-in (/Applications/MATLAB_R2017a.app/toolbox/matlab/matfun/@single/eig)'

imshow не является встроенным, а является частьюосновной панели инструментов MATLAB:

>> p=which('imshow')
p =
    '/Applications/MATLAB_R2017a.app/toolbox/matlab/images/imshow.m'

imdilate - это функция, которая поставляется с инструментарием обработки изображений:

>> p = which('imdilate')
p =
    '/Applications/MATLAB_R2017a.app/toolbox/images/images/imdilate.m'

и prettyplot - это функция, которую я написал сам:

>> p = which('prettyplot')
p =
    '/Users/cris/matlab/toolbox/cris/prettyplot.m'

Чтобы провести различие между этими 4 случаями, сначала проверьте, начинается ли возвращаемая строка со «встроенной», затем проверьте, содержит ли она fullfile(matlabroot,'toolbox','matlab'), указывая, что она является частью ядра MATLAB.панели инструментов, затем проверьте, содержит ли он fullfile(matlabroot,'toolbox'), указывая, что он является частью другогоr Официальная панель инструментов:

function_name = 'eig';
p = which(function_name);
if startsWith(p,'built-in')
   disp('built-in')
elseif contains(p,fullfile(matlabroot,'toolbox','matlab'))
   disp('part of core MATLAB toolbox')
elseif contains(p,fullfile(matlabroot,'toolbox'))
   disp('part of an official MATLAB toolbox')
else
   disp('not an official MATLAB function')
end

Однако учтите, что некоторые функции могут быть перегружены!И если вы проверяете свой исходный код, чтобы проверить, какие функции используются, вам нужно знать типы передаваемых аргументов.Например:

>> which -all eig
built-in (/Applications/MATLAB_R2017a.app/toolbox/matlab/matfun/@single/eig)  % single method
built-in (/Applications/MATLAB_R2017a.app/toolbox/matlab/matfun/@double/eig)  % double method
/Users/cris/newdip/target/dip/share/DIPimage/@dip_image/eig.m                 % dip_image method

Здесь вы можете видеть, что есть три eig функции, одна используется, если ее входной аргумент имеет тип single, одна, если это double, и одна, еслиэто dip_image (пользовательский класс).В зависимости от входа, используемая функция eig является встроенной или сторонней.

Грустная часть в том, что вы не будете знать, какая из них используется, пока не запустите свой код.Вы можете вручную проверить, какие значения имеют входные переменные, иногда это понятно.Но это не всегда так, тип может зависеть от данных вне рассматриваемой функции.

Итак, лучший способ собрать список функций, которые использует ваша программа, - запустить профилировщик.

Другая альтернатива: компилятор MATLAB (отдельный продукт) соберет все исходные M-файлы, которые использует ваша функция, и объединит их в один распространяемый пакет.

2 голосов
/ 22 мая 2019

Хотя я думаю, что решения, основанные на which, лучше, для полноты, мы должны также рассмотреть функцию exist для этого.Из документации:

exist name возвращает тип name в виде числа.Этот список описывает тип, связанный с каждым значением:

  • 0 - name не существует или не может быть найден по другим причинам.Например, если name существует в ограниченной папке, к которой MATLAB® не имеет доступа, exist возвращает 0.

  • 1 - name - переменная в рабочей области.

  • 2 - name - это файл с расширением .m, .mlx или .mlapp, или name - это имя файла с незарегистрированным файломрасширение (.mat, .fig, .txt).

  • 3 - name - это MEX-файл в вашем пути поиска MATLAB.

  • 4 - name - это загруженная модель Simulink® или файл модели или библиотеки Simulink в вашем пути поиска MATLAB.

  • 5 - name - встроенная функция MATLAB.Сюда не входят классы.

  • 6 - name - это файл P-кода в вашем пути поиска MATLAB.

  • 7 - name - это папка.

  • 8 - name - это класс.(существующий возвращает 0 для классов Java, если вы запускаете MATLAB с параметром -nojvm.)

Поэтому, когда мы попробуем это на примерах, показанных ранее :

>> exist eig
ans =
     5
>> exist solve
ans =
     2
>> exist nosuchfunction
ans =
     0
1 голос
/ 22 мая 2019

Просто введите open и имя функции в командном окне

open function_name

И function_name будет отображено в редакторе, вы можете увидеть Mathwork copyright внутри него, если это сборкав функции иначе это не

Так выглядит авторское право

%   Copyright 1993-2016 The MathWorks, Inc. 
...