Main Content

コマンド構文または関数構文の選択

MATLAB® には、"関数構文""コマンド構文"と呼ばれる、関数を呼び出す 2 つの方法があります。このページでは、これらの構文形式の違いと、コマンド構文に関連する一般的な誤りを回避する方法について説明します。

関数の呼び出しに関する紹介情報については、関数の呼び出しを参照してください。関数の定義に関連する情報については、関数のファイルでの作成を参照してください。

コマンド構文と関数構文

MATLAB では、以下のステートメントは等価です。

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

この等価性は、"コマンドと関数の二重性" と呼ばれることがあります。

すべての関数で、次の標準関数構文がサポートされています。

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

関数構文では、入力はデータ、変数、さらに MATLAB 式にすることもできます。入力が数値 2 または string 配列 ["a" "b" "c"] などのデータである場合、MATLAB はそれを関数にそのまま渡します。入力が変数の場合、MATLAB はその変数に代入された値を渡します。入力が 2+2 または sin(2*pi) のような式の場合、MATLAB はそれを最初に評価し、結果を関数に渡します。関数に出力がある場合、上記の構文例で示すように、それらを変数に代入できます。

コマンド構文のほうがシンプルですが、より多くの制限があります。これを使用するには、コンマではなくスペースで入力を区切ります。また、それらを小かっこで囲むことはありません。

functionName input1 ... inputN

コマンド構文を使用すると、MATLAB はすべての入力を文字ベクトルとして渡し (つまり、一重引用符で囲まれているかのように)、出力をユーザー定義変数に代入しません。関数が出力を返した場合は、その出力は変数 ans に代入されます。文字ベクトル以外のデータ型を渡すには、関数構文を使用します。スペースが含まれる値を渡すには、2 つのオプションがあります。1 つは、関数構文を使用することです。もう 1 つは、値を一重引用符で囲むことです。そうしないと、MATLAB は、値を複数の入力に分割するものとしてスペースを扱います。

値が変数に代入されている場合、関数構文を使用してその値を関数に渡さなければなりません。コマンド構文では常に入力を文字ベクトルとして渡し、変数値を渡すことはできません。変数の値として渡すことはできません。たとえば、変数を作成して関数構文で関数 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 tempdircd('tempdir')cd(tempdir)
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 'hello world'

disp "string"disp('"string"')disp("string")

変数名の引き渡し

saveloadclearwhos などの一部の関数では、変数名に文字ベクトルが求められます。以下に例を示します。

whos -file durer.mat X

ここでは、例ファイル durer.mat の変数 X に関する情報が要求されます。このコマンドは以下の式と等価です。

whos('-file','durer.mat','X')

MATLAB によるコマンド構文の認識方法

あいまいと見なされる可能性のある次のステートメントについて考察します。

ls ./d

これは、'./d' を引数とした関数 ls の呼び出しの可能性があります。また、変数 d を除数として使用し、配列 ls の要素ごとの除算を表している可能性もあります。

このステートメントをコマンド ラインに記述した場合、MATLAB では構文規則、現在のワークスペース、およびパスを使用して、lsd が関数と変数のどちらであるかを判断します。ただし、コード アナライザーやエディター/デバッガーのような一部のコンポーネントは、パスやワークスペースを参照せずに動作します。これらのコンポーネントを使用している場合、MATLAB では構文ルールを使用して、式がコマンド構文を使用した関数呼び出しであるかどうかを判断します。

一般に、MATLAB で関数または変数を指定する識別子が認識されると、式の種類を判別するためにその識別子に続く文字が以下のように解析されます。

  • 等号 (=) がある場合は代入と考えられます。以下に例を示します。

    ls =d
  • 識別子の後に左小かっこがある場合は、関数呼び出しと考えられます。以下に例を示します。

    ls('./d')
  • 識別子の後にスペースがあり、演算子の可能性がある要素の後にはスペースがない場合は、コマンド構文を使用した関数呼び出しと考えられます。以下に例を示します。

    ls ./d
  • 演算子の可能性がある要素の前後にスペースがあるか、またはどちら側にもスペースがない場合は、変数を用いた演算であると考えられます。たとえば、次の 2 つのステートメントは等価です。

    ls ./ d
    
    ls./d

したがって、MATLAB は、あいまいと見なされる可能性のある ls ./d というステートメントを、コマンド構文を使用した関数 ls の呼び出しとして扱います。

ベスト プラクティスとして、一般的な関数と競合する変数名は定義しないようにして、あいまいな記述を避け、演算子の前後に一貫した空白を入れるか、明示的な小かっこを使用して関数を呼び出してください。

参考

|