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 передает его функции как есть. Если вход будет переменной 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
загрузка
clear
, и whos
. Например,
whos -file durer.mat X
запрашивает информацию о переменной X
в файле в качестве примера durer.mat
. Эта команда эквивалентна
whos('-file','durer.mat','X')
Рассмотрите потенциально неоднозначное выражение
ls ./d
Это могло быть вызовом ls
функция с './d'
в качестве его аргумента. Это также могло представлять поэлементное деление на массиве ls
, использование переменной d
- делитель.
Если вы вводите это выражение в командной строке, MATLAB может получить доступ к текущей рабочей области и пути, чтобы определить ли ls
и d
функции или переменные. Однако некоторые компоненты, такие как Анализатор кода и Редактор/Отладчик, действуют независимо от пути или рабочей области. Когда вы используете те компоненты, MATLAB использует синтаксические правила, чтобы определить, является ли выражение вызовом функции с помощью синтаксиса команд.
В общем случае, когда MATLAB распознает идентификатор (который может назвать функцию или переменную), он анализирует символы, которые следуют за идентификатором, чтобы определить тип выражения, можно следующим образом:
Знак "равно" (=
) подразумевает присвоение. Например:
ls =d
Открывающая скобка после идентификатора подразумевает вызов функции. Например:
ls('./d')
Пробел после идентификатора, но не после потенциального оператора, подразумевает вызов функции с помощью синтаксиса команд. Например:
ls ./d
Пробелы с обеих сторон потенциального оператора или никаких пробелов по обе стороны от оператора, подразумевают использование переменных. Например, эти операторы эквивалентны:
ls ./ d ls./d
Поэтому MATLAB обрабатывает потенциально неоднозначное выражение ls ./d
как вызов ls
функция с помощью синтаксиса команд.
Лучшая практика состоит в том, чтобы избегать таких имен переменных, которые конфликтуют с общими функциями, чтобы предотвратить любую неоднозначность.