Сравнение синтаксиса команд и функций

Команда и синтаксисы функций

В MATLAB® эти операторы эквивалентны:

load durer.mat        % Command syntax
load('durer.mat')     % Function syntax

Эта эквивалентность иногда упоминается как command-function duality.

Все функции поддерживают этот стандартный function syntax:

[output1, ..., outputM] = functionName(input1, ..., inputN)

Если вы не требуете никаких выходных параметров от функции, и все входные параметры являются векторами символов (то есть, текст, заключенный в одинарные кавычки), можно использовать этот более простой command syntax:

functionName input1 ... inputN

С синтаксисом команд вы разделяете входные параметры пробелами, а не запятыми, и не заключаете входные параметры в круглые скобки. Синтаксис команд всегда передает входные параметры как векторы символов. Чтобы использовать строки в качестве входных параметров, используйте синтаксис функций. Если вектор символов содержит пробел, используйте синтаксис функций.

Когда входной параметр функции является переменной, необходимо использовать синтаксис функций, чтобы передать значение функции. Синтаксис команд всегда передает входные параметры как векторы символов и не может передать значения переменных. Например, создайте переменную и вызовите disp функция с синтаксисом функций, чтобы передать значение переменной:

A = 123;
disp(A)

Этот код возвращает ожидаемый результат,

123

Вы не можете использовать синтаксис команд, чтобы передать значение A, потому что этот вызов

disp A

эквивалентно

disp('A')

и возвращается

A

Распространенные ошибки

Предположим, что ваша рабочая область содержит эти переменные:

filename = 'accounts.txt';
A = int8(1:8);
B = A;

Следующая таблица иллюстрирует общие неправильные применения синтаксиса команд.

Эта команда...Эквивалентно...Правильный синтаксис для передающего значения
open filenameopen('filename')open(filename)
isequal A Bisequal('A','B')isequal(A,B)
strcmp class(A) int8strcmp('class(A)','int8')strcmp(class(A),'int8')
cd matlabrootcd('matlabroot')cd(matlabroot)
isnumeric 500isnumeric('500')isnumeric(500)
round 3.499round('3.499'), который эквивалентен round([51 46 52 57 57])round(3.499)
disp hello worlddisp('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')

Как MATLAB распознает синтаксис команд

Рассмотрите потенциально неоднозначное выражение

ls ./d

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

Если вы вводите такое выражение в командной строке, MATLAB может получить доступ к текущей рабочей области и пути, чтобы определить ли ls и d функции или переменные. Однако некоторые компоненты, такие как Анализатор кода и Редактор/Отладчик, действуют независимо от пути или рабочей области. В тех случаях MATLAB использует синтаксические правила, чтобы определить, является ли выражение вызовом функции с помощью синтаксиса команд.

В общем случае, когда MATLAB распознает идентификатор (который может назвать функцию или переменную), он анализирует символы, которые следуют за идентификатором, чтобы определить тип выражения, можно следующим образом:

  • Знак "равно" (=) подразумевает присвоение. Например:

    ls =d
  • Открывающая скобка после идентификатора подразумевает вызов функции. Например:

    ls('./d')
  • Пробел после идентификатора, но не после потенциального оператора, подразумевает вызов функции с помощью синтаксиса команд. Например:

    ls ./d
  • Пробелы с обеих сторон потенциального оператора или никаких пробелов по обе стороны от оператора, подразумевают использование переменных. Например, эти операторы эквивалентны:

    ls ./ d
    
    ls./d

Поэтому потенциально неоднозначное выражение ls ./d вызов ls функция с помощью синтаксиса команд.

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