Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

matlabFunction

関数ハンドルまたはファイルへのシンボリック式の変換

説明

ht = matlabFunction(f) は、シンボリック式またはシンボリック関数 f を、ハンドル ht をもつ MATLAB® 関数に変換します。シンボリック式やシンボリック関数に double データ型を扱う同等の MATLAB 関数がある場合、変換された関数は Symbolic Math Toolbox™ なしで使用できます。

ht = matlabFunction(f1,...,fN) は、f1,...,fN を出力 N をもつ MATLAB 関数に変換します。この関数のハンドルは ht になります。f1,...,fN の各要素は、シンボリック式、シンボリック関数、あるいはシンボリック式またはシンボリック関数のベクトルまたは行列になります。

ht = matlabFunction(___,Name,Value) は、前述の構文の入力引数の組み合わせのいずれかに加えて、1 つ以上の名前と値の引数を使用して、オプションを指定します。

たとえば、名前と値の引数 File 指定して、生成した MATLAB 関数をファイルに書き込むことができます。また、名前と値の引数 Vars を指定して、スカラー変数とベクトル変数が組み合わされた入力引数をもつ MATLAB 関数を生成することもできます。

すべて折りたたむ

シンボリック式 r を、ハンドル ht をもつ MATLAB 関数に変換します。変換された関数は Symbolic Math Toolbox なしで使用できます。

syms x y
r = sqrt(x^2 + y^2);
ht = matlabFunction(r)
ht =
  function_handle with value:
    @(x,y)sqrt(x.^2+y.^2)

コンマ区切りの入力を使用して、複数のシンボリック式を変換します。

ht = matlabFunction(r,r^2)
ht =
  function_handle with value:
    @(x,y)deal(sqrt(x.^2+y.^2),x.^2+y.^2)

シンボリック関数を作成し、ハンドル ht をもつ MATLAB 関数へ変換します。

syms x y
f(x,y) = x^3 + y^3;
ht = matlabFunction(f)
ht = 
  function_handle with value:
    @(x,y)x.^3+y.^3

名前と値の引数 File を指定して、生成した MATLAB 関数をファイルに書き込みます。既存のファイルは上書きされます。ファイルへの書き込みの際に、matlabFunctiont0t1 といった名前の中間変数を使用してコードを最適化します。名前と値の引数 Comments を使用して、ファイル内にコメントを含めます。

f から生成した MATLAB 関数を、ファイル myfile に書き込みます。

syms x
f = x^2 + log(x^2);
matlabFunction(f,"File","myfile");
function f = myfile(x)
%MYFILE
%    F = MYFILE(X)

%    This function was generated by the Symbolic Math Toolbox version 8.4.
%    01-Sep-2019 00:00:00

t2 = x.^2;
f = t2+log(t2);

コメント Version: 1.1 をファイルに含めます。

matlabFunction(f,"File","myfile","Comments","Version: 1.1");
function f = myfile(x)
...
%Version: 1.1
t2 = x.^2;
...

シンボリック式を MATLAB 関数に変換するとき、得られる関数の入力引数の順序を指定することができます。一部の入力引数をスカラー変数としてではなく、ベクトルとして指定することもできます。

シンボリック式を作成します。

syms x y z
r = x + y/2 + z/3;

r を MATLAB 関数に変換し、この関数をファイル myfile に書き込みます。既定では、matlabFunction は変数名に小文字のみを含むシンボリック式を変換するときに入力引数をアルファベット順に使用します。生成される入力引数は、スカラー変数 xyz です。

matlabFunction(r,"File","myfile");
function r = myfile(x,y,z)
%MYFILE
%    R = MYFILE(X,Y,Z)
r = x+y./2.0+z./3.0;

生成された MATLAB 関数の入力引数の順序を変更するには、名前と値の引数 Vars をベクトル [y z x] として指定します。生成される入力引数は、スカラー変数 yzx です。

matlabFunction(r,"File","myfile","Vars",[y z x]);
function r = myfile(y,z,x)
%MYFILE
%    R = MYFILE(Y,Z,X)
r = x+y./2.0+z./3.0;

次に、シンボリック式 v を、その入力引数がスカラーとベクトルである MATLAB 関数に変換します。名前と値の引数 Vars を cell 配列 {t,[x y z]} として指定します。生成される入力引数は、スカラー変数 t と 1 行 3 列のベクトル変数 in2 です。

syms x y z t
v = (x + y/2 + z/3)*exp(-t);
matlabFunction(v,"File","myfile","Vars",{t,[x y z]});
function v = myfile(t,in2)
%MYFILE
%    R = MYFILE(T,IN2)
x = in2(:,1);
y = in2(:,2);
z = in2(:,3);
v = exp(-t).*(x+y./2.0+z./3.0);

ベクトル変数である入力引数を使用して MATLAB 関数を生成するには、名前と値の引数 Vars を cell 配列として指定します。

2 つの 1 行 3 列のベクトルのドット積を求めるシンボリック式を作成します。

syms x y [1 3] real
f = dot(x,y);

この式 f を MATLAB 関数に変換します。Vars を cell 配列 {x,y} として指定します。生成される入力引数は、それぞれ xy に対応する 2 つの 1 行 3 列のベクトル変数 in1in2 です。

matlabFunction(f,"File","myfile","Vars",{x,y});
function f = myfile(in1,in2)
%MYFILE
%    F = MYFILE(IN1,IN2)
x1 = in1(:,1);
x2 = in1(:,2);
x3 = in1(:,3);
y1 = in2(:,1);
y2 = in2(:,2);
y3 = in2(:,3);
f = x1.*y1+x2.*y2+x3.*y3;

次に、4 つの変数から成る関数であるシンボリック関数を作成します。

syms g(x,y,z,t)
g(x,y,z,t) = x^2 + y^2 + z^2 - t^2;

この関数 g を MATLAB 関数に変換します。g の入力変数から生成された入力引数を 4 行 1 列の列ベクトルとして指定するには、4 行 1 列のベクトルを含む cell 配列として Vars を指定します。argnames を使用すると、入力変数 xyz、および tg から取得できます。

matlabFunction(g,"File","myfunction","Vars",{argnames(g).'});
function g = myfunction(in1)
%MYFUNCTION
%    G = MYFUNCTION(IN1)
x = in1(1,:);
y = in1(2,:);
z = in1(3,:);
t = in1(4,:);
g = -t.^2+x.^2+y.^2+z.^2;

シンボリック式を MATLAB 関数に変換して得られた関数をファイルに書き込むとき、既定では、matlabFunction はコードの最適化を行います。この方法は、以降のこのファイルを使用した計算の単純化および高速化に役立ちます。ただし、一部のシンボリック式やシンボリック関数では、そこからの最適化コードの生成に時間がかかることがあります。コードの最適化を無効にするには、名前と値の引数 Optimize を使用します。

シンボリック式を作成します。

syms x
r = x^2*(x^2 + 1);

r を MATLAB 関数に変換し、その関数をファイル myfile に書き込みます。既定では、matlabFunction は最適化されたコードを含むファイルを生成します。

f = matlabFunction(r,"File","myfile");
function r = myfile(x)
%MYFILE
%    R = MYFILE(X)
t2 = x.^2;
r = t2.*(t2+1.0);

Optimizefalse に設定することによって、コードの最適化を無効にします。

f = matlabFunction(r,"File","myfile","Optimize",false);
function r = myfile(x)
%MYFILE
%    R = MYFILE(X)
r = x.^2.*(x.^2+1.0);

シンボリック行列を MATLAB 関数に変換する場合、matlabFunction は既定でこのシンボリック行列を密行列で表します。入力シンボリック行列のほとんどの要素が 0 の場合、スパース行列でシンボリック行列を表すのが最も効率的です。

3 行 3 列のシンボリック対角行列を作成します。

syms x
A = diag(x*ones(1,3))
A =
[ x, 0, 0]
[ 0, x, 0]
[ 0, 0, x]

A を数値行列を表す MATLAB 関数に変換し、その結果をファイル myfile1 に書き込みます。既定では、生成された MATLAB 関数は、行列の各要素 (すべてゼロ要素の場合を含む) を指定する数値密行列を作成します。

f1 = matlabFunction(A,"File","myfile1");
function A = myfile1(x)
%MYFILE1
%    A = MYFILE1(X)
A = reshape([x,0.0,0.0,0.0,x,0.0,0.0,0.0,x],[3,3]);

名前と値の引数 Sparsetrue に設定することによって、A を MATLAB 関数に変換します。これで、生成された MATLAB 関数は、非ゼロ要素のみを指定し、他のすべての要素をゼロと仮定するスパース数値行列を作成します。

f2 = matlabFunction(A,"File","myfile2","Sparse",true);
function A = myfile2(x)
%MYFILE2
%    A = MYFILE2(X)
A = sparse([1,2,3],[1,2,3],[x,x,x],3,3);

シンボリック式を MATLAB 関数に変換するときに、出力変数の名前を指定することができます。名前と値の引数 File をもたない (または空の文字ベクトルとして指定されたファイル パスをもつ) matlabFunction は、関数ハンドルを作成し、名前と値の引数 Outputs を無視することに注意してください。

シンボリック式 r および q を作成します。

syms x y z
r = x^2 + y^2 + z^2;
q = x^2 - y^2 - z^2;

r および q を 1 つの MATLAB 関数に変換し、得られた関数を、2 つの要素 name1name2 からなるベクトルを返すファイル myfile に書き込みます。

f = matlabFunction(r,q,"File","myfile", ...
                   "Outputs",{'name1','name2'});
function [name1,name2] = myfile(x,y,z)
%MYFILE
%    [NAME1,NAME2] = MYFILE(X,Y,Z)
t2 = x.^2;
t3 = y.^2;
t4 = z.^2;
name1 = t2+t3+t4;
if nargout > 1
    name2 = t2-t3-t4;
end

シンボリック関数を無名 MATLAB 関数に変換することにより、指定された座標でのシンボリック関数の評価を高速化できます。matlabFunction を使用して変換を実行します。シンボリック関数の評価は正確なシンボリック数を返しますが、MATLAB 関数の評価は倍精度数を返します。

xyz の関数であるシンボリック関数 f(x,y,z) を作成します。

syms f(x,y,z)
f(x,y,z) = y*z*sin(x) + x*sin(z)*cos(y) - z^3;

指定した区間の 3 次元グリッド座標を作成します。

[xDouble,yDouble,zDouble] = meshgrid(1:20,1:50,1:20);

これらの座標でシンボリック関数を評価します。tic の呼び出しと toc の呼び出しのペアを使用して経過時間を測定します。

tic
fResult = f(xDouble,yDouble,zDouble);
toc
Elapsed time is 1.961984 seconds.

ここでは、評価は遅いものの、正確なシンボリック数を返します。結果のサンプルを表示します。

fResult(1:2,1:2,20)
ans = 

(20sin(1)+cos(1)sin(20)-800020sin(2)+2cos(1)sin(20)-800040sin(1)+cos(2)sin(20)-800040sin(2)+2cos(2)sin(20)-8000)

関数の評価を高速化するには、matlabFunction を使用してシンボリック関数を MATLAB 関数に変換します。同じ座標で MATLAB 関数を評価します。

f1 = matlabFunction(f);
tic
fResult = f1(xDouble,yDouble,zDouble);
toc
Elapsed time is 0.028676 seconds.

ここでは、評価が速くなります。評価された MATLAB 関数は、倍精度の数値を返します。結果のサンプルを表示します。

fResult(1:2,1:2,20)
ans = 2×2
103 ×

   -7.9827   -7.9808
   -7.9667   -7.9644

入力引数

すべて折りたたむ

MATLAB 関数に変換されるシンボリック入力。シンボリック式、シンボリック関数、シンボリック ベクトルまたはシンボリック行列として指定します。スパースなシンボリック ベクトルまたはシンボリック行列を変換する場合、名前と値の引数 Sparsetrue として指定します。

N 個の出力をもつ MATLAB 関数に変換されるシンボリック入力。コンマで区切られたシンボリック式、シンボリック関数、シンボリック ベクトル、またはシンボリック行列として指定します。

matlabFunction は、シンボリック ベクトルまたはシンボリック行列の各要素に対する個別の出力引数を作成しません。たとえば、ht = matlabFunction([x + 1, y + 1]) は 1 つの出力引数をもつ MATLAB 関数を作成しますが、ht = matlabFunction(x + 1, y + 1) は 2 つの出力引数をもつ MATLAB 関数を作成します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は関係ありません。

例: matlabFunction(f,File="myfile",Optimize=false)

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: matlabFunction(f,"File","myfile","Optimize",false)

ファイル ヘッダーに含めるコメント。文字ベクトル、文字ベクトルの cell 配列、または string 配列として指定します。

生成された MATLAB 関数を含むファイルへのパス。文字ベクトルまたは string スカラーとして指定します。この生成された関数は double 型の引数を受け入れます。また、Symbolic Math Toolbox なしで使用できます。File が空の場合、matlabFunction は無名関数を作成します。File.m で終わっていない場合は、関数は .m を追加します。

ファイルへの書き込みの際に、matlabFunctiont0t1 といった名前の中間変数を使用してコードを最適化します。コードの最適化を無効にするには、名前と値の引数 Optimize を使用します。

MATLAB 関数とコメントのファイルへの書き込みを参照してください。

関数ファイルに書き込まれたコードを最適化するかどうか。logical 1 (true) または 0 (false) として指定します。

ファイルへの書き込みの際に、matlabFunction は、既定で t0t1 といった名前の中間変数を使用してコードを最適化します。

名前と値の引数 File をもたない (または空の文字ベクトルとして指定されたファイル パスをもつ) matlabFunction を使用すると、関数ハンドルが作成されます。この場合、コードは既定で最適化されません。Optimizetrue に設定して強制的にコードの最適化を行おうとすると、matlabFunction はエラーをスローします。

コードの最適化の無効化を参照してください。

スパース行列の生成を使用するかどうか。logical 0 (false) または 1 (true) として指定します。既定では、Sparsefalse であるため、生成された MATLAB 関数は数値密行列でシンボリック行列を表します。Sparsetrue として指定すると、生成された MATLAB 関数はスパース数値行列でシンボリック行列を表します。ゼロの要素を多く含むシンボリック行列を変換する場合、Sparsetrue として指定します。多くの場合、スパース行列での演算は、密行列での同じ演算よりも効率的です。

スパース行列の生成を参照してください。

生成された MATLAB 関数の入力変数または入力ベクトルの次数。文字ベクトル、シンボリック変数から成るベクトル、または文字ベクトル、シンボリック変数またはシンボリック変数から成るベクトルの 1 次元 cell 配列として指定します。

指定された入力変数の数は、f 内のシンボリック変数の数以上でなければなりません。Vars で指定される入力変数および Outputs で指定される出力変数には、同じ名前を使用しないでください。

変数名に小文字のみを含むシンボリック式を変換する場合、入力変数は既定でアルファベット順になります。シンボリック関数を変換するときは、入力引数は他の変数の前に配置され、その他の変数はアルファベット順に並べ替えられます。

Vars をベクトルとして指定して、スカラー変数の入力引数をもつ MATLAB 関数を生成します。Vars を cell 配列として指定して、スカラー変数とベクトル変数の組み合わせの入力引数をもつ MATLAB 関数を生成します。

生成された関数の入力引数の指定を参照してください。

出力変数名。文字ベクトルの 1 次元 cell 配列として指定します。

出力変数名を指定しない場合、matlabFunction を呼び出し時に使用する名前と同じになります。個々の変数でなく式を使用して matlabFunction を呼び出す場合、出力変数の既定の名前は、out に番号を付けたものになります。たとえば、out3 のようになります。

Vars で指定される入力変数および Outputs で指定される出力変数には、同じ名前を使用しないでください。

名前と値の引数 File をもたない (または空の文字ベクトルとして指定されたファイル パスをもつ) matlabFunction は、関数ハンドルを作成します。この場合、matlabFunction は、名前と値の引数 Outputs を無視します。

出力変数の指定を参照してください。

出力引数

すべて折りたたむ

MATLAB 関数ハンドル。この関数ハンドルを使用して、Symbolic Math Toolbox なしで使用する数値結果を返すことができます。

制限

  • simplifysolve といった、double データ型を扱い、対応する MATLAB 関数をもたないいくつかのシンボリック関数は、変換後の MATLAB 関数ハンドルやファイルにシンボリック関数として保持されます。これらの関数で構成された変換ファイルは、MATLAB Coder™MATLAB Compiler™ では展開できません。double データ型を使用する独自の関数を作成して、これらのシンボリック関数を置き換える必要があります。展開できないシンボリック関数の詳細については、MathWorks テクニカルサポートにお問い合わせください。

ヒント

  • 名前と値の引数 File を使用する際、rehash により、生成された関数がすぐに利用可能になります。rehash は、検索パス上にあるディレクトリにおいて既知のファイルの MATLAB リストを更新します。

  • 名前と値の引数 File が空の場合、MATLAB 関数は無名関数を返します。

  • 区分的な条件などの条件ステートメントがシンボリック式に含まれている場合、matlabFunction はその式を MATLAB ファイルに変換できますが、無名関数には変換できません。生成されたファイル内の関数はスカラー入力のみを受け入れることができます。たとえば、区分的な条件を piecewiseFunc という名前の MATLAB ファイルに変換します。

    syms x
    p = piecewise(x<0, x^2-8, x>=0, -x)
    matlabFunction(p,"File","piecewiseFunc")
    y1 = piecewiseFunc(0)
    y2 = piecewiseFunc(-2)
  • matlabFunction を使用して、1 つ以上のシンボリック式を単一の MATLAB 関数に変換し、結果の関数を M ファイルに書き込みます。その後、生成された M ファイルを MATLAB Compiler で使用して、スタンドアロン アプリケーションや Web アプリを作成できます。例については、MATLAB Compiler を使用してシンボリック式から生成された MATLAB 関数の展開を参照してください。

    さらに、生成された M ファイルを MATLAB Coder アプリで使用して、C または C++ のコードを作成できます。例については、MATLAB Coder アプリを使用した、シンボリック式からの C コードの生成を参照してください。

  • スカラー変数とベクトル変数が組み合わされた入力引数をもつ MATLAB 関数を生成するには、名前と値の引数 Vars を cell 配列として指定します。例については、生成された関数の入力引数の指定およびベクトル入力引数を使用した関数の生成を参照してください。

バージョン履歴

R2008b で導入