Main Content

Java 执行 MATLAB 函数

调用 MATLAB 函数

您可以使用 MatlabEngine fevalfevalAsync 方法从 Java® 执行 MATLAB® 函数。这些方法的工作方式类似于 MATLAB feval 函数。如果要将函数执行的结果返回给 Java 或从 Java 传递参量,请使用 fevalfevalAsync

要调用 MATLAB 函数,需要满足以下条件:

  • 将函数名称作为字符串传递。

  • 定义 MATLAB 函数所需的输入参量。

  • 指定 MATLAB 函数所需的输出的数量(如果未指定,则假定为 1)。

  • 为 MATLAB 函数的输出定义适当的返回类型。

  • 使用写入器将输出从 MATLAB 命令行窗口重定向到 Java。

您还可以使用 MatlabEngine evalevalAsync 方法来计算 MATLAB 表达式。这些方法使您能够在 MATLAB 工作区中创建变量,但不返回值。

使用单一返回参量执行函数

以下示例代码使用 MATLAB sqrt 函数求双精度数组中元素的平方根。feval 方法返回包含 sqrt 函数调用结果的双精度数组。

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 函数对作为输入参量传递的两个整数值求最大公约数和 Bézout 系数。feval 方法返回包含 gcd 函数调用结果的对象数组。返回值是整数。

由于 MATLAB gcd 函数返回三个输出参量,请将返回值的数量指定为 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 fevalfevalAsync 方法可以指定由 MATLAB 函数返回的输出参量的数量。默认情况下,来自 MATLAB 函数的输出参量的数量假定为 1

如果要调用 MATLAB 函数且不提供输出或提供多个输出,请将该输出数量指定为传递给 fevalfevalAsync 的第一个参量。

例如,以下代码使用带有三个输出参量的语法调用 MATLAB gcd 函数:

Object[] results = eng.feval(3, "gcd", 40, 60);

根据请求的输出数量,MATLAB 函数的行为可能会有所不同。某些函数不返回任何输出或返回指定数量的输出。例如,MATLAB pause 函数使执行暂停指定的秒数。但是,如果您使用一个输出参量调用 pause,此函数将立即返回状态值。因此,以下代码不会导致 MATLAB 暂停,原因是 feval 请求一个输出参量。

eng.feval("pause", 10);

要使 MATLAB 执行暂停 10 秒,请将输出数量指定为 0

eng.feval(0, "pause", 10);

注意

要确保调用 MATLAB 函数而不提供输出,请将返回参量的数量指定为 0

相关主题