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 に指定します。