MATLAB-関数
関数は、一緒にタスクを実行するステートメントのグループです。MATLABでは、関数は別々のファイルで定義されます。ファイルと関数の名前は同じである必要があります。
関数は、独自のワークスペース内の変数を操作します。これは、 local workspace、MATLABコマンドプロンプトでアクセスするワークスペースとは別に、 base workspace。
関数は複数の入力引数を受け入れることができ、複数の出力引数を返す場合があります。
関数ステートメントの構文は次のとおりです。
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
例
名前の次の関数mymaxは、名前のファイルに記述する必要がありますmymax.m。引数として5つの数値を取り、最大数を返します。
mymax.mという名前の関数ファイルを作成し、その中に次のコードを入力します-
function max = mymax(n1, n2, n3, n4, n5)
%This function calculates the maximum of the
% five numbers given as input
max = n1;
if(n2 > max)
max = n2;
end
if(n3 > max)
max = n3;
end
if(n4 > max)
max = n4;
end
if(n5 > max)
max = n5;
end
関数の最初の行はキーワードで始まります function。関数の名前と引数の順序を示します。この例では、mymax関数には5つの入力引数と1つの出力引数があります。
関数ステートメントの直後にあるコメント行は、ヘルプテキストを提供します。これらの行は、「-」と入力すると印刷されます。
help mymax
MATLABは上記のステートメントを実行し、次の結果を返します-
This function calculates the maximum of the
five numbers given as input
関数は次のように呼び出すことができます-
mymax(34, 78, 89, 23, 11)
MATLABは上記のステートメントを実行し、次の結果を返します-
ans = 89
匿名関数
匿名関数は、単一のMATLABステートメント内で定義される従来のプログラミング言語のインライン関数のようなものです。これは、単一のMATLAB式と、任意の数の入力引数と出力引数で構成されます。
匿名関数は、MATLABコマンドラインで、または関数やスクリプト内で定義できます。
このようにして、ファイルを作成しなくても簡単な関数を作成できます。
式から無名関数を作成するための構文は次のとおりです。
f = @(arglist)expression
例
この例では、powerという名前の無名関数を記述します。この関数は、2つの数値を入力として受け取り、最初の数値を2番目の数値の累乗で返します。
スクリプトファイルを作成し、その中に次のコードを入力します-
power = @(x, n) x.^n;
result1 = power(7, 3)
result2 = power(49, 0.5)
result3 = power(10, -10)
result4 = power (4.5, 1.5)
ファイルを実行すると、-が表示されます。
result1 = 343
result2 = 7
result3 = 1.0000e-10
result4 = 9.5459
主機能と副機能
匿名関数以外の関数は、ファイル内で定義する必要があります。各関数ファイルには、最初に表示される必須のプライマリ関数と、プライマリ関数の後に続き、それによって使用されるオプションのサブ関数がいくつでも含まれています。
プライマリ関数は、コマンドラインまたは他の関数から、それらを定義するファイルの外部から呼び出すことができますが、サブ関数は、関数ファイルの外部のコマンドラインまたは他の関数から呼び出すことはできません。
サブ関数は、それらを定義する関数ファイル内のプライマリ関数と他のサブ関数にのみ表示されます。
例
二次方程式の根を計算する二次という名前の関数を書いてみましょう。この関数は、2次係数、線形係数、および定数項の3つの入力を取ります。それは根を返します。
関数ファイルquadratic.mには、判別式を計算する一次関数二次関数とサブ関数ディスクが含まれます。
関数ファイルquadratic.mを作成し、その中に次のコードを入力します-
function [x1,x2] = quadratic(a,b,c)
%this function returns the roots of
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficients of x2, x and the
%constant term
% It returns the roots
d = disc(a,b,c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of quadratic
function dis = disc(a,b,c)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
上記の関数は、コマンドプロンプトから次のように呼び出すことができます。
quadratic(2,4,-4)
MATLABは上記のステートメントを実行し、次の結果を返します-
ans = 0.7321
入れ子関数
別の関数の本体内で関数を定義できます。これらは入れ子関数と呼ばれます。ネストされた関数には、他の関数のコンポーネントの一部またはすべてが含まれます。
ネストされた関数は別の関数のスコープ内で定義され、それらは含まれている関数のワークスペースへのアクセスを共有します。
入れ子関数は次の構文に従います-
function x = A(p1, p2)
...
B(p2)
function y = B(p3)
...
end
...
end
例
前の例の2次関数を書き直してみましょう。ただし、今回はディスク関数が入れ子関数になります。
関数ファイルquadratic2.mを作成し、その中に次のコードを入力します-
function [x1,x2] = quadratic2(a,b,c)
function disc % nested function
d = sqrt(b^2 - 4*a*c);
end % end of function disc
disc;
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of function quadratic2
上記の関数は、コマンドプロンプトから次のように呼び出すことができます。
quadratic2(2,4,-4)
MATLABは上記のステートメントを実行し、次の結果を返します-
ans = 0.73205
プライベート関数
プライベート関数は、他の関数の限られたグループにのみ表示される主要な関数です。関数の実装を公開したくない場合は、それらをプライベート関数として作成できます。
プライベート関数はにあります subfolders 特別な名前で private。
これらは、親フォルダー内の関数にのみ表示されます。
例
二次関数を書き直してみましょう。ただし、今回は判別式を計算するディスク関数をプライベート関数にします。
作業ディレクトリにprivateという名前のサブフォルダを作成します。次の関数ファイルdisc.mを格納します-
function dis = disc(a,b,c)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
作業ディレクトリに関数quadratic3.mを作成し、次のコードを入力します-
function [x1,x2] = quadratic3(a,b,c)
%this function returns the roots of
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficient of x2, x and the
%constant term
% It returns the roots
d = disc(a,b,c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of quadratic3
上記の関数は、コマンドプロンプトから次のように呼び出すことができます。
quadratic3(2,4,-4)
MATLABは上記のステートメントを実行し、次の結果を返します-
ans = 0.73205
グローバル変数
グローバル変数は、複数の関数で共有できます。このためには、すべての関数で変数をグローバルとして宣言する必要があります。
ベースワークスペースからその変数にアクセスする場合は、コマンドラインで変数を宣言します。
変数が実際に関数で使用される前に、グローバル宣言を行う必要があります。グローバル変数の名前に大文字を使用して、他の変数と区別することをお勧めします。
例
average.mという名前の関数ファイルを作成し、その中に次のコードを入力してみましょう-
function avg = average(nums)
global TOTAL
avg = sum(nums)/TOTAL;
end
スクリプトファイルを作成し、その中に次のコードを入力します-
global TOTAL;
TOTAL = 10;
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
av = average(n)
ファイルを実行すると、次の結果が表示されます-
av = 35.500