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

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

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

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

Эта эквивалентность иногда упоминается как двойственность команд и функций.

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

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

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

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, load, 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 использование синтаксиса команд.

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

Была ли эта тема полезной?