从 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
。