Как определить, является ли функция встроенной или самоопределяемой по ее имени?

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
142
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

open function_name

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

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

%   Copyright 1993-2016 The MathWorks, Inc. 

Является ли функция встроенной или нет, легче всего увидеть с помощью команды 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 нигде не определена.

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') , что указывает на то, что он является частью другого официального набора инструментов:

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-файлы, используемые вашей функцией, и упакует их вместе в один распространяемый пакет.

Программу/профайлер запускать не нужно - посмотрите matlab.codetools.requiredFilesAndProducts('filename.m'). Затем вы можете выполнить тест exist/which для каждого из возвращенных файлов.

Dev-iL 22.05.2019 08:55
Ответ принят как подходящий

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

exist name returns the type of name as a number. This list describes the type associated with each value:

  • 0 — name does not exist or cannot be found for other reasons. For example, if name exists in a restricted folder to which MATLAB® does not have access, exist returns 0.

  • 1 — name is a variable in the workspace.

  • 2 — name is a file with extension .m, .mlx, or .mlapp, or name is the name of a file with a non-registered file extension (.mat, .fig, .txt).

  • 3 — name is a MEX-file on your MATLAB search path.

  • 4 — name is a loaded Simulink® model or a Simulink model or library file on your MATLAB search path.

  • 5 — name is a built-in MATLAB function. This does not include classes.

  • 6 — name is a P-code file on your MATLAB search path.

  • 7 — name is a folder.

  • 8 — name is a class. (exist returns 0 for Java classes if you start MATLAB with the -nojvm option.)

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

>> exist eig
ans =
     5
>> exist solve
ans =
     2
>> exist nosuchfunction
ans =
     0

Другие вопросы по теме