将 Java 对象传递给 MATLAB
概述
此示例向您说明如何创建一个 Java® 应用程序,使用 MATLAB® 优化函数 fminsearch 和 MWJavaObjectRef 类来查找目标函数的局部最小值。
在此示例中,您执行以下步骤:
使用 MATLAB Compiler SDK™ 创建一个包,将 MATLAB 优化例程应用于作为 Java 对象实现的目标函数。
在 MATLAB 应用程序中访问 Java 函数,包括使用
MWJavaObjectRef类创建对 Java 对象的引用并将其传递给生成的 Java 方法。构建并运行应用程序。
OptimDemo 包
OptimDemo 包找到目标函数的局部最小值并返回最小位置和值。
该包使用 MATLAB 优化函数 fminsearch,此示例优化了 MATLAB fminsearch 文档中使用的 Rosenbrock banana 函数。
Optimizer 类对作为 Java 对象实现的目标函数执行无约束非线性优化。此类的方法 doOptim 接受初始猜测和实现目标函数的 Java 对象,并返回局部最小值的位置和值。第二种方法 displayObj 是一个列出 Java 对象特征的调试工具。
doOptim 和 displayObj 这两个方法封装了 MATLAB 函数。
文件
| MATLAB 函数 | doOptim.m displayObj.m |
| MATLAB 函数位置 | |
| Java 代码位置 | |
javabuilder.jar | |
过程
将 MATLAB 附带的
ObjectRefExample文件夹复制到您的工作文件夹:copyfile(fullfile(matlabroot,'toolbox','javabuilder','Examples','ObjectRefExample'),'ObjectRefExample')
在 MATLAB 命令提示符下,导航到工作文件夹中的新
ObjectRefExample\ObjectRefDemoComp子文件夹。检查您想要从 MATLAB 访问的 Java 代码。此示例使用
doOptim.m和displayObj.m。function [x,fval] = doOptim(h, x0) directEval = h.evaluateFunction(x0) wrapperEval = mWrapper(x0) [x,fval] = fminsearch(mWrapper,x0)function className = displayObj(h) h className = class(h) whos('h') methods(h)
使用以下信息构建 Java 包,可通过 Java 包编译器应用或
compiler.build.javaPackage进行操作:字段 值 Java 包名称 OptimDemo类名 Optimizer要编译的文件 doOptim.m
displayObj.m例如,如果您使用的是
compiler.build.javaPackage,请输入:buildResults = compiler.build.javaPackage(["doOptim.m","displayObj.m"], ... 'PackageName','OptimDemo', ... 'ClassName','Optimizer');
有关详细信息,请参阅生成 Java 包并编译 Java 应用程序中的说明。
为实现要优化的对象函数的类编写源代码。此示例的代码位于文件
BananaFunction.java中。该类实现了 MATLAB
fminsearch文档中描述的 Rosenbrock banana 函数。为访问 MATLAB 函数的应用程序编写源代码。此示例的代码位于文件
PerformOptim.java中。程序执行以下操作:
实例化上面的
BananaFunction类的对象以进行优化。创建一个引用
MWJavaObjectRef对象的BananaFunction,如下所示:.origRef = new MWJavaObjectRef(objectiveFunction);实例化一个优化器对象。
调用
displayObj方法来验证 Java 对象是否被正确传递。调用
doOptim方法,该方法使用fminsearch来查找目标函数的局部最小值。使用
try/catch模块来处理异常。使用
MWArray方法释放本机资源。
在 MATLAB 中,导航到
ObjectRefDemoJavaApp文件夹。将生成的
OptimDemo.jar包复制到此文件夹中。例如,如果您使用了
compiler.build.javaPackage,请输入:copyfile(fullfile('..','ObjectRefDemoComp','OptimDemojavaPackage','OptimDemo.jar'))
打开命令提示符窗口并导航到您复制
ObjectRefDemoJavaAppOptimDemo.jar文件夹。使用
PerformOptim.java编译BananaFunction.java应用程序和javac帮助类。Windows®
要编译
BananaFunction.java,请输入:要编译javac -classpath "matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar BananaFunction.javaPerformOptim.java,请输入:javac -classpath "matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar PerformOptim.javaUNIX®
要编译
BananaFunction.java,请输入:要编译javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./OptimDemo.jar BananaFunction.javaPerformOptim.java,请输入:javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./OptimDemo.jar PerformOptim.java
将
替换为 MATLAB 或 MATLAB Runtime 安装文件夹的路径。例如,在 Windows 上,路径可能为matlabrootC:\Program Files\MATLAB\R2025a。运行
PerformOptim应用程序。在 Windows 上,键入:
java -classpath .;"matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar PerformOptim -1.2 1.0在 Linux® 上,键入:
java -classpath .:"matlabroot/toolbox/javabuilder/jar/javabuilder.jar":.\OptimDemo.jar PerformOptim -1.2 1.0注意
如果您在 Mac 64 位平台上运行该应用程序,则必须在 Java 命令中添加
-d64标志。
PerformOptim 程序显示以下输出:
Using x0 =
-1.2000 1.0000
*****************************************************
** Properties of Java object **
*****************************************************
h =
BananaFunction@1766806
className =
BananaFunction
Name Size Bytes Class Attributes
h 1x1 BananaFunction
Methods for class BananaFunction:
BananaFunction getClass notifyAll
equals hashCode toString
evaluateFunction notify wait
** Finished DISPLAYOBJ ******************************
*****************************************************
** Performing unconstrained nonlinear optimization **
*****************************************************
directEval =
24.2000
wrapperEval =
24.2000
x =
1.0000 1.0000
fval =
8.1777e-10
Optimization successful
** Finished DOOPTIM *********************************
Location of minimum:
1.0000 1.0000
Function value at minimum:
8.1777e-10
另请参阅
compiler.build.javaPackage | Java 包编译器
