Выполнить файл или вызвать функцию, файл которой находится в другой папке с помощью MATLAB? - PullRequest
26 голосов
/ 27 мая 2011

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

/Map/map1;

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

cd Map;
map1;
cd ..;

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

Ответы [ 3 ]

39 голосов
/ 27 мая 2011

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

run - это вспомогательная функция, которая запускает сценарии, которые в данный момент не находятся на пути.

Вы называете свою функцию / скрипт как

run /Map/map1 

Если вы хотите запустить функцию / скрипт, просто введя его имя, а не полный (или относительный) путь, вам следует добавить папку в ваш путь.

Как отмечает @mutzmatron, вы не можете использовать run для вызова функций с аргументами ввода / вывода. Таким образом, если только это не скрипт / функция без аргументов ввода / вывода, использование run не будет работать, и вам придется добавить папку в ваш путь.


EDIT

Так же, как и в случае с хорошей практикой кодирования, и для работы в случаях, когда ваша функция имеет входы / выходы, добавление / удаление папки из вашего пути - правильный путь. Так что для вашего случая,

addpath /Map
...

map1;

...
rmpath /Map

Важно то, что ваш вызов функции находится между командами addpath и rmpath. Если у вас есть функции с одинаковыми именами в обеих папках, то вам следует смещать их по кругу, то есть до и после, чтобы избежать конфликтов.

7 голосов
/ 28 мая 2011

Просто добавьте все эти каталоги в путь Matlab с помощью addpath, как предлагает gnovice.Тогда вы сможете нормально вызывать функции, и они будут видны для команд which (), help (), depfun () и других команд метапрограммирования Matlab.Вы можете поместить вызовы addpath() в файл startup.m, чтобы они автоматически появлялись при каждом запуске Matlab.

Изменение пути с помощью addpath / map1 () / rmpath каждый раз имеет некоторые недостатки.

  • Это снижение производительности, потому что вы добавляете манипулирование путями к каждому вызову.
  • Функции в разных каталогах не смогут видеть друг друга.
  • Труднее будет писать и отлаживать функции, потому что контекст пути, в котором они выполняются, будет динамически изменяться и выигрыватьне совпадает с тем, что вы видите, когда находитесь в редакторе и базовой рабочей области.
  • Вам необходим дополнительный код обработки ошибок, чтобы убедиться, что путь восстановлен правильно, если вызванная функция вышла из строя.
  • Это не будет работать с компилятором Matlab, если вы захотите развернуть этот код в какой-то момент.

А использование run () или cd () самостоятельно - это ужасно, потому что относительные путивозникнут проблемы.

Если вы действительно хотите разделить функции в подкаталогах, чтобы они не могли «видеть» друг друга, вы можете создать пространства имен этих каталогов, поставив перед ними «+»имена, а затем квалифицируйте вызовы функций в пространстве имен, например Map.map1().

0 голосов
/ 17 февраля 2017

Просто чтобы внести свой вклад в дебаты об изменении пути ...

Один из способов сделать это немного "безопаснее" - написать:

% start of my code: create function handles 
% to the functions I need:
try
   cd Map
   map1_func = @map1;
catch mexception
end
cd ..

Это попытается сохранить текущий каталоги вы получите указатель на функцию в другом каталоге.

Единственное, этот метод не будет работать, если map1 полагается на другие функции в каталоге Map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...