从 Java 执行 MATLAB 函数
调用 MATLAB 函数
您可以使用 MatlabEngine
feval
和 fevalAsync
方法从 Java® 执行 MATLAB® 函数。这些方法的工作方式类似于 MATLAB feval
函数。如果要将函数执行的结果返回给 Java 或从 Java 传递参量,请使用 feval
和 fevalAsync
。
要调用 MATLAB 函数,需要满足以下条件:
将函数名称作为字符串传递。
定义 MATLAB 函数所需的输入参量。
指定 MATLAB 函数所需的输出的数量(如果未指定,则假定为 1)。
为 MATLAB 函数的输出定义适当的返回类型。
使用写入器将输出从 MATLAB 命令行窗口重定向到 Java。
您还可以使用 MatlabEngine
eval
和 evalAsync
方法来计算 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
feval
和 fevalAsync
方法可以指定由 MATLAB 函数返回的输出参量的数量。默认情况下,来自 MATLAB 函数的输出参量的数量假定为 1
。
如果要调用 MATLAB 函数且不提供输出或提供多个输出,请将该输出数量指定为传递给 feval
或 fevalAsync
的第一个参量。
例如,以下代码使用带有三个输出参量的语法调用 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
。