Подтвердить что ты не робот

Выполнение файла или вызов функции, файл которой помещен в другую папку с MATLAB?

Пробовал Googling, но ничего не смог найти.
У меня есть несколько файлов и папок в моей текущей папке MATLAB.
Одна из этих папок называется "Карта", и у нее есть файл "map1.m", который я хочу вызвать из моего кода в текущей папке MATLAB.
В моем коде я не могу назвать это следующим образом:

/Map/map1;

но я могу сделать так вот так:

cd Map;
map1;
cd ..;

Как-то вышеуказанный метод кажется неправильным. Есть ли более элегантный способ сделать это?

4b9b3361

Ответ 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.