主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

Java 对象传递给 MATLAB

概述

此示例向您说明如何创建一个 Java® 应用程序,使用 MATLAB® 优化函数 fminsearchMWJavaObjectRef 类来查找目标函数的局部最小值。

在此示例中,您执行以下步骤:

  1. 使用 MATLAB Compiler SDK™ 创建一个包,将 MATLAB 优化例程应用于作为 Java 对象实现的目标函数。

  2. 在 MATLAB 应用程序中访问 Java 函数,包括使用 MWJavaObjectRef 类创建对 Java 对象的引用并将其传递给生成的 Java 方法。

  3. 构建并运行应用程序。

OptimDemo 包

OptimDemo 包找到目标函数的局部最小值并返回最小位置和值。

该包使用 MATLAB 优化函数 fminsearch,此示例优化了 MATLAB fminsearch 文档中使用的 Rosenbrock banana 函数。

Optimizer 类对作为 Java 对象实现的目标函数执行无约束非线性优化。此类的方法 doOptim 接受初始猜测和实现目标函数的 Java 对象,并返回局部最小值的位置和值。第二种方法 displayObj 是一个列出 Java 对象特征的调试工具。

doOptimdisplayObj 这两个方法封装了 MATLAB 函数。

文件

MATLAB 函数doOptim.m
displayObj.m
MATLAB 函数位置matlabroot\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoComp
Java 代码位置matlabroot\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoJavaApp
javabuilder.jarmatlabroot\toolbox\javabuilder\jar

过程

  1. 将 MATLAB 附带的 ObjectRefExample 文件夹复制到您的工作文件夹:

    copyfile(fullfile(matlabroot,'toolbox','javabuilder','Examples','ObjectRefExample'),'ObjectRefExample')

    在 MATLAB 命令提示符下,导航到工作文件夹中的新 ObjectRefExample\ObjectRefDemoComp 子文件夹。

  2. 检查您想要从 MATLAB 访问的 Java 代码。此示例使用 doOptim.mdisplayObj.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)

  3. 使用以下信息构建 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 应用程序中的说明。

  4. 为实现要优化的对象函数的类编写源代码。此示例的代码位于文件 BananaFunction.java 中。

     BananaFunction.java

    该类实现了 MATLAB fminsearch 文档中描述的 Rosenbrock banana 函数。

  5. 为访问 MATLAB 函数的应用程序编写源代码。此示例的代码位于文件 PerformOptim.java 中。

     PerformOptim.java

    程序执行以下操作:

    • 实例化上面的 BananaFunction 类的对象以进行优化。

    • 创建一个引用 MWJavaObjectRef 对象的 BananaFunction,如下所示:

      origRef = new MWJavaObjectRef(objectiveFunction);
      .

    • 实例化一个优化器对象。

    • 调用 displayObj 方法来验证 Java 对象是否被正确传递。

    • 调用 doOptim 方法,该方法使用 fminsearch 来查找目标函数的局部最小值。

    • 使用 try/catch 模块来处理异常。

    • 使用 MWArray 方法释放本机资源。

  6. 在 MATLAB 中,导航到 ObjectRefDemoJavaApp 文件夹。

  7. 将生成的 OptimDemo.jar 包复制到此文件夹中。

    例如,如果您使用了 compiler.build.javaPackage,请输入:

    copyfile(fullfile('..','ObjectRefDemoComp','OptimDemojavaPackage','OptimDemo.jar'))
  8. 打开命令提示符窗口并导航到您复制 ObjectRefDemoJavaAppOptimDemo.jar 文件夹。

  9. 使用 PerformOptim.java 编译 BananaFunction.java 应用程序和 javac 帮助类。

    • Windows®

      要编译 BananaFunction.java,请输入:

      javac -classpath "matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar BananaFunction.java
      要编译 PerformOptim.java,请输入:
      javac -classpath "matlabroot\toolbox\javabuilder\jar\javabuilder.jar";.\OptimDemo.jar PerformOptim.java

    • UNIX®

      要编译 BananaFunction.java,请输入:

      javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./OptimDemo.jar BananaFunction.java
      要编译 PerformOptim.java,请输入:
      javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar":./OptimDemo.jar PerformOptim.java

    matlabroot 替换为 MATLAB 或 MATLAB Runtime 安装文件夹的路径。例如,在 Windows 上,路径可能为 C:\Program Files\MATLAB\R2025a

  10. 运行 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

另请参阅

|

主题