Java からの MATLAB 関数の実行
MATLAB 関数の呼び出し
MatlabEngine
の feval
メソッドおよび fevalAsync
メソッドを使用して、Java® から MATLAB® 関数を実行することができます。これらのメソッドは MATLAB 関数 feval
のように機能します。feval
と fevalAsync
は、関数の実行結果を Java に返す場合、または Java からの引数を渡す場合に使用します。
MATLAB 関数を呼び出すには、以下を実行します。
関数名を文字列として渡します。
MATLAB 関数に必要な入力引数を定義します。
MATLAB 関数で想定される出力の数を指定します (指定されていない場合は 1 と仮定)。
MATLAB 関数の出力の適切な戻り値の型を定義します。
ライターを使用して MATLAB コマンド ウィンドウからの出力を Java にリダイレクトします。
また、MatlabEngine
の eval
メソッドと evalAsync
メソッドを使用して MATLAB 式を評価することもできます。これらのメソッドを使うと MATLAB ワークスペースで変数を作成できるようになりますが、その場合、値は返されません。
戻り引数を 1 つ指定した関数の実行
このコード例では、MATLAB 関数 sqrt
を使用して、double の配列における要素の平方根を求めます。feval
メソッドは、関数 sqrt
の呼び出しの結果が含まれた double 配列を返します。
import com.mathworks.engine.*; public class javaFevalFunc{ public static void main(String[] args) throws Exception{ MatlabEngine eng = MatlabEngine.startMatlab(); double[] a = {2.0 ,4.0, 6.0}; double[] roots = eng.feval("sqrt", a); for (double e: roots) { System.out.println(e); } eng.close(); } }
戻り引数を複数指定した関数の実行
このコード例では、MATLAB 関数 gcd
を使用して、入力引数として渡される 2 つの整数値から最大公約数とベズー係数を求めます。feval
メソッドは、関数 gcd
の呼び出しの結果が格納されたオブジェクト配列を返します。戻り値は整数です。
MATLAB 関数 gcd
は 3 つの出力引数を返すため、戻り値の数を feval
メソッドの最初の引数として指定します。
import com.mathworks.engine.*; public class javaFevalFcnMulti { public static void main(String[] args) throws Exception { MatlabEngine eng = MatlabEngine.startMatlab(); Object[] results = eng.feval(3, "gcd", 40, 60); Integer G = (Integer)results[0]; Integer U = (Integer)results[1]; Integer V = (Integer)results[2]; eng.close(); } }
出力引数の数を指定する場合
MatlabEngine
の feval
メソッドと fevalAsync
メソッドを使用すると、MATLAB 関数によって返される出力引数の数を指定できます。既定では、MATLAB 関数の出力引数の数は 1
であると仮定されます。
出力なしで、あるいは複数の出力を指定して MATLAB 関数の呼び出す場合は、その数を feval
または fevalAsync
に渡す最初の引数として指定します。
たとえば、次のコードでは、3 出力引数の構文を指定して MATLAB 関数 gcd
を呼び出しています。
Object[] results = eng.feval(3, "gcd", 40, 60);
MATLAB 関数の動作は、要求された出力の数によって異なる場合があります。一部の関数では、出力を返さないようにすることや、指定数の出力を返すことができます。たとえば、MATLAB 関数 pause
を実行すると、指定した秒数だけ実行が停止します。しかし、出力引数を指定して pause
を呼び出すと、関数によってただちにステータス値が返されます。したがって、次のコードでは feval
が 1 つの出力引数を要求しているため、MATLAB は一時停止しません。
eng.feval("pause", 10);
要求された 10 秒間 MATLAB の実行を停止するには、出力の数を 0
に指定します。
eng.feval(0, "pause", 10);
メモ
MATLAB 関数が必ず出力なしで呼び出されるようにするには、戻り引数の数を 0
に指定します。