主要内容

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

将 Java 对象传递给 MATLAB

R2026a

概述

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

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

  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 对象特征的调试工具。

doOptim 和 displayObj 这两个方法封装了 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.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)

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

    public class BananaFunction {
    	public BananaFunction() {}
    	public double evaluateFunction(double[] x)
    	{
    		/* Implements the Rosenbrock banana function described in 
    		 * the FMINSEARCH documentation
    		 */
    		double term1 = 100*java.lang.Math.pow((x[1]-Math.pow(x[0],2.0)),2.0); 
    		double term2 =  Math.pow((1-x[0]),2.0);
    		return term1 + term2;
    	}
    }

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

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

    /* Necessary package imports */
    import com.mathworks.toolbox.javabuilder.*;
    import OptimDemo.*;
    /*
     * Demonstrates the use of the MWJavaObjectRef class
     * Takes initial point for optimization as two arguments:
     *    PerformOptim -1.2 1.0
     */
    class PerformOptim
    {
    	public static void main(String[] args)
    	{
    		Optimizer theOptimizer = null;		/* Stores component 
                                           instance */
    		MWJavaObjectRef origRef = null;	/* Java object reference to 
                                         be passed to component */
    		MWJavaObjectRef outputRef = null;	/* Output data extracted 
                                            from result */
    		MWNumericArray x0 = null;	/* Initial point for optimization */
    		MWNumericArray x = null;	/* Location of minimal value */
    		MWNumericArray fval = null;	/* Minimal function value */
    		Object[] result = null;	/* Stores the result */
    
    		try
    		{
    			/* If no input, exit */
    			if (args.length < 2)
    			{
    				System.out.println("Error: must input initial x0_1 
                                                and x0_2 position");
    				return;
    			}
    
    			/* Instantiate a new Java object */
    			/* This should only be done once per application instance */
    			theOptimizer = new Optimizer();
    
    			try {
    				/* Initial point --- parse data from text fields */
    				double[] x0Data = new double[2];
    				x0Data[0] = Double.valueOf(args[0]).doubleValue();
    				x0Data[1] = Double.valueOf(args[1]).doubleValue();
    				x0 = new MWNumericArray(x0Data, MWClassID.DOUBLE);
    				System.out.println("Using x0 =");
    				System.out.println(x0);
    
    				/* Create object reference to objective function object */
    				BananaFunction objectiveFunction = new BananaFunction();
    				origRef = new MWJavaObjectRef(objectiveFunction);
    
    				/* Pass Java object to a MATLAB function that lists its 
                                  methods, etc */            
    				System.out.println("*********************************");
    				System.out.println("** Properties of Java object   **");
    				System.out.println("*********************************");
    				result = theOptimizer.displayObj(1, origRef);     
    				MWArray.disposeArray(result);
    				System.out.println("** Finished DISPLAYOBJ **********");
    
    				/* Call the Java component to optimize the function */
    				/* using the MATLAB function FMINSEARCH */
    				System.out.println("**********************************");
    				System.out.println("** Unconstrained nonlinear optim**");
    				System.out.println("**********************************");
    				result = theOptimizer.doOptim(2, origRef, x0);
    				try {
    					System.out.println("** Finished DOOPTIM ****** *********");
    					x = (MWNumericArray)result[0];
    					fval = (MWNumericArray)result[1];
    
    					/* Display the results of the optimization */
    					System.out.println("Location of minimum: ");
    					System.out.println(x);
    					System.out.println("Function value at minimum: ");
    					System.out.println(fval.toString());
    				}
    				finally
    				{
    					MWArray.disposeArray(result);
    				}
    			}
    			finally
    			{
    				/* Free native resources */
    				MWArray.disposeArray(origRef);
    				MWArray.disposeArray(outputRef);
    				MWArray.disposeArray(x0);
    			}
    		}
    		catch (Exception e)
    		{
    			System.out.println("Exception: " + e.toString());
    		}
    
    		finally
    		{
    			/* Free native resources */
    			if (theOptimizer != null)
    				theOptimizer.dispose();
    		}
    	}
    }

    程序执行以下操作:

    • 实例化上面的 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\R2026a。

  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

另请参阅

|

主题