Main Content

Java からの MATLAB 関数の実行

MATLAB 関数の呼び出し

MatlabEnginefeval メソッドおよび fevalAsync メソッドを使用して、Java® から MATLAB® 関数を実行することができます。これらのメソッドは MATLAB 関数 feval のように機能します。fevalfevalAsync は、関数の実行結果を Java に返す場合、または Java からの引数を渡す場合に使用します。

MATLAB 関数を呼び出すには、以下を実行します。

  • 関数名を文字列として渡します。

  • MATLAB 関数に必要な入力引数を定義します。

  • MATLAB 関数で想定される出力の数を指定します (指定されていない場合は 1 と仮定)。

  • MATLAB 関数の出力の適切な戻り値の型を定義します。

  • ライターを使用して MATLAB コマンド ウィンドウからの出力を Java にリダイレクトします。

また、MatlabEngineeval メソッドと 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();
    }
}

出力引数の数を指定する場合

MatlabEnginefeval メソッドと 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 に指定します。

関連するトピック