Выполнение файла или вызов функции, файл которой помещен в другую папку с MATLAB?
Пробовал Googling, но ничего не смог найти.
У меня есть несколько файлов и папок в моей текущей папке MATLAB.
Одна из этих папок называется "Карта", и у нее есть файл "map1.m", который я хочу вызвать из моего кода в текущей папке MATLAB.
В моем коде я не могу назвать это следующим образом:
/Map/map1;
но я могу сделать так вот так:
cd Map;
map1;
cd ..;
Как-то вышеуказанный метод кажется неправильным. Есть ли более элегантный способ сделать это?
Ответы
Ответ 1
Вы можете запустить файл без добавления папки на свой путь вручную, используя команду run
, которая специально предназначена для таких случаев. Из документации:
run - это функция удобства, которая запускает сценарии, которые в настоящее время не находятся на пути.
Вы вызываете свою функцию / script как
run /Map/map1
Если вы хотите запустить функцию / script, просто введя ее имя, а не полный (или относительный) путь, то вы должны добавить папку в свой путь.
Как отмечено @mutzmatron, вы не можете использовать run
для вызова функций с аргументами ввода/вывода. Таким образом, если только функция script/без аргументов ввода/вывода с использованием run
не будет работать, и вам нужно будет добавить папку к вашему пути.
ИЗМЕНИТЬ
Как хорошая практика кодирования и работа в тех случаях, когда ваша функция имеет входы/выходы, добавление/удаление папки с вашего пути - правильный путь. Итак, для вашего случая,
addpath /Map
...
map1;
...
rmpath /Map
Важно то, что ваш вызов функции зажат между командами addpath
и rmpath
. Если у вас есть одно и то же имя в обеих папках, вы должны сэндвич закрепить его, т.е. Строку до и после строки, чтобы избежать конфликтов.
Ответ 2
Просто добавьте все эти каталоги в путь Matlab с помощью addpath
, как предлагает gnovice. Затем вы сможете нормально вызывать функции, и они будут видны которым(), help(), depfun() и другим командам мета-программирования Matlab. Вы можете поместить вызовы addpath()
в ваш startup.m
файл, чтобы они автоматически отображались каждый раз, когда вы запускаете Matlab.
Изменение пути с помощью addpath/map1()/rmpath каждый раз имеет некоторые недостатки.
- Это удар производительности, потому что вы добавляете манипуляции с каждым вызовом.
- Функции в разных каталогах не смогут видеть друг друга.
- Будет сложнее писать и отлаживать функции, потому что контекст пути, в котором они выполняются, будет динамически изменяться и не будет таким же, как то, что вы видите, когда находитесь в редакторе и базовом рабочем пространстве.
- Вам нужен дополнительный код обработки ошибок, чтобы убедиться, что путь правильно восстановлен, если вызываемые функции не работают.
- Это не будет работать с компилятором Matlab, если вы захотите развернуть этот код в какой-то момент.
И используя run() или cd() самостоятельно, уродливо, потому что относительные пути будут иметь проблемы.
Если вы действительно хотите отделить функции в подкаталогах, чтобы они не могли "видеть" друг друга, вы можете сделать эти пространства имен каталогов, поставив перед ними "+", а затем квалифицировать вызовы функций с помощью пространство имен, например Map.map1()
.
Ответ 3
Просто чтобы внести свой вклад в дискуссию по изменению пути...
Один из способов сделать это "безопаснее" - написать
% start of my code: create function handles
% to the functions I need:
try
cd Map
map1_func = @map1;
catch mexception
end
cd ..
Это пытается сохранить текущий каталог, и вы получите дескриптор функции в другом каталоге.
Единственное, этот метод не будет работать, если map1
полагается на другие функции в каталоге Map
.