MATLAB® имеет два способа вызова функций, называемых function syntax и command syntax. На этой странице рассматриваются различия между этими форматами синтаксиса и как избежать распространенных ошибок, связанных с синтаксисом команды.
Для получения вводной информации о функциях вызова см. Вызов функций. Для получения информации об определении функций смотрите Создание функций в файлах.
В MATLAB эти операторы эквивалентны:
load durer.mat % Command syntax load('durer.mat') % Function syntax
Эта эквивалентность иногда упоминается как command-function duality.
Все функции поддерживают этот стандартный синтаксис функции:
[output1, ..., outputM] = functionName(input1, ..., inputN)
В синтаксисе функции входами могут быть данные, переменные и даже выражения MATLAB. Если вход является данными, такими как числовое значение 2
или строковые массивы ["a" "b" "c"]
MATLAB передает его в функцию as-is. Если вход является переменной, MATLAB передаст значение, присвоенное ему. Если вход является выражением, как 2+2
или sin(2*pi)
MATLAB сначала оценивает его, и передает результат функции. Если функции имеют выходы, можно назначить их переменным, как показано на примере выше.
Синтаксис команды проще, но более ограничен. Чтобы использовать его, разделите входы с пространствами, а не запятыми, и не заключайте их в круглые скобки.
functionName input1 ... inputN
С синтаксисом команды MATLAB передает все входы как векторы символов (то есть как если бы они были заключены в одинарные кавычки) и не присваивает выходы переменным. Чтобы передать тип данных, отличный от вектора символов, используйте синтаксис функции. Чтобы передать значение, содержащее пространство, у вас есть две опции. Один из них - использовать синтаксис функции. Другой - поставить одинарные кавычки вокруг значения. В противном случае MATLAB рассматривает пространство как разделение вашего значения на несколько входов.
Если значение назначено переменной, необходимо использовать синтаксис функции, чтобы передать значение функции. Синтаксис команды всегда передает входы как векторы символов и не может передать значения переменных. Например, создайте переменную и вызовите disp
функция с синтаксисом функции, чтобы передать значение переменной:
A = 123; disp(A)
Этот код возвращает ожидаемый результат,
123
Вы не можете использовать синтаксис команды, чтобы передать значение A
, потому что этот вызов
disp A
эквивалентно
disp('A')
и возвращает
A
Предположим, что ваша рабочая область содержит следующие переменные:
filename = 'accounts.txt'; A = int8(1:8); B = A;
Следующая таблица иллюстрирует распространенные неправильные применения синтаксиса команды.
Эта команда... | Эквивалентно... | Правильный синтаксис для передачи значения |
---|---|---|
open filename | open('filename') | open(filename) |
isequal A B | isequal('A','B') | isequal(A,B) |
strcmp class(A) int8 | strcmp('class(A)','int8') | strcmp(class(A),'int8') |
cd tempdir | cd('tempdir') | cd(tempdir) |
isnumeric 500 | isnumeric('500') | isnumeric(500) |
round 3.499 | round('3.499') , что эквивалентно round([51 46 52 57 57]) | round(3.499) |
disp hello world | disp('hello','world') |
или
|
disp "string" | disp('"string"') | disp("string") |
Некоторые функции ожидают векторов символов для имен переменных, таких как save
, load
, clear
, и whos
. Для примера,
whos -file durer.mat X
запрашивает информацию о переменной X
в файле примера durer.mat
. Эта команда эквивалентна
whos('-file','durer.mat','X')
Рассмотрим потенциально неоднозначное выражение
ls ./d
Это может быть вызов на ls
функция со './d'
как его аргумент. Это также может представлять поэлементное деление массива ls
, с использованием переменной d
как делитель.
Если вы выпускаете этот оператора в командной строке, MATLAB может получить доступ к текущей рабочей области и пути, чтобы определить, ls
и d
являются функциями или переменными. Однако некоторые компоненты, такой как анализатор кода и Editor/Debugger, работают без ссылки на путь или рабочую область. Когда вы используете эти компоненты, MATLAB использует синтаксические правила, чтобы определить, является ли выражение вызовом функции, используя синтаксис команды.
В целом, когда MATLAB распознает идентификатор (который может назвать функцию или переменную), он анализирует символы, которые следуют за идентификатором, чтобы определить тип выражения, следующим образом:
Знак равенства (=
) подразумевает присвоение. Для примера:
ls =d
Открытые круглые скобки после идентификатора подразумевают вызов функции. Для примера:
ls('./d')
Пространство после идентификатора, но не после потенциального оператора, подразумевает вызов функции с помощью синтаксиса команды. Для примера:
ls ./d
Пространства с обеих сторон потенциального оператора или никакие пространства с обеих сторон оператора подразумевают использование переменных. Для примера эти операторы эквивалентны:
ls ./ d ls./d
Поэтому MATLAB обрабатывает потенциально неоднозначное выражение ls ./d
как вызов к ls
функция с использованием синтаксиса команды.
Лучшая практика состоит в том, чтобы избегать таких имен переменных, которые конфликтуют с общими функциями, чтобы предотвратить любую неоднозначность.