Передайте объекты Java MATLAB

Цель

Цель этого примера состоит в том, чтобы показать вам как:

  • Используйте продукт MATLAB® Compiler SDK™, чтобы создать пакет, который применяет стандартные программы оптимизации MATLAB к целевым функциям, реализованным, когда Java® возражает.

  • Доступ к функциям MATLAB в приложении Java, включая использование класса MWJavaObjectRef, чтобы создать ссылку на объект Java и передать его сгенерированным методам Java.

    Примечание

    Для полной справочной информации об иерархии классов MWArray смотрите пакет Javadoc com.mathworks.toolbox.javabuilder в matlabroot/help/toolbox/javabuilder/MWArrayAPI.

  • Создайте и запустите приложение.

Пакет OptimDemo

  • Пакет OptimDemo находит локальный минимум целевой функции и возвращает минимальное местоположение и значение.

  • Пакет использует функцию оптимизации MATLAB fminsearch, и этот пример оптимизирует банановую функцию Розенброка, используемую в документации fminsearch MATLAB.

  • Класс, Оптимизатор, выполняет неограниченную нелинейную оптимизацию на целевой функции, реализованной как объект Java.

  • Метод этого класса, doOptim, принимает исходное предположение и объект Java, который реализует целевую функцию и возвращает местоположение и значение локального минимума.

  • Второй метод, displayObj, является средством отладки, которое перечисляет характеристики объекта Java.

  • Эти два метода, doOptim и displayObj, инкапсулируют функции MATLAB. Код MATLAB для этих двух методов находится в doOptim.m и displayObj.m, который может быть найден в matlabroot\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoComp.

Предпосылки

  • Запустите этот пример путем создания новой папки работы, которая видима к пути поиска файлов MATLAB. В этом примере мы будем использовать следующие папки:

    Windows®: c:\matlab\work

    Linux®: ~/matlab/work

  • Если вы уже не сделали так, установил переменные окружения, которые требуются на машине разработки. Для получения дополнительной информации смотрите, Конфигурируют Вашу Среду Java.

  • Скопируйте следующие файлы в папку work:

    Файл (файлы)ОтК

    javabuilder.jar

    matlabroot\toolbox\javabuilder\jar\win64

    Windows: c:\matlab\work

    Linux: ~/matlab/work

    doOptim.m

    displayObj.m

    matlabroot\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoComp

    Windows: c:\matlab\work

    Linux: ~/matlab/work

    BananaFunction.java

    PerformOptim.java

    matlabroot\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoJavaApp

    Windows: c:\matlab\work

    Linux: ~/matlab/work

    Ваша папка work должна теперь иметь следующие пять файлов:

    c:\matlab\work

    javabuilder.jar
    doOptim.m
    displayObj.m
    BananaFunction.java
    PerformOptim.java

Процедура

  1. Откройте MATLAB и cd к папке work, которую вы создали в необходимом как условие разделе.

  2. Запишите код MATLAB, к которому вы хотите получить доступ из Java. Этот пример использует doOptim.m и displayObj.m, которые уже находятся в вашей папке work.

    Для ссылки код от doOptim.m отображен здесь:

    function [x,fval] = doOptim(h, x0)
    directEval = h.evaluateFunction(x0)
    wrapperEval = mWrapper(x0)
    [x,fval] = fminsearch(mWrapper,x0)
    Для ссылки код от displayObj.m отображен здесь:
    function className = displayObj(h)
    h
    className = class(h)
    whos('h')
    methods(h)

  3. В подсказке команды MATLAB введите libraryCompiler, чтобы открыть приложение Library Compiler.

  4. Используйте приложение Library Compiler, чтобы создать пакет Java из функций MATLAB doOptim.m и displayObj.m. Используйте следующие соглашения о присвоении имен для своего пакета:

    Сохраните проект в своей папке work с помощью имени:OptimDemo
    Имя библиотеки:OptimDemo
    ClassName :Optimizer
    Экспортируемые Функции (файлы, чтобы скомпилировать):doOptim.m и displayObj.m

    Классы Java, созданные приложением Library Compiler, служат оберткой вокруг кода MATLAB.

    Приложение Library Compiler создаст папку именем OptimDemo в директории c:\matlab\work. Папка OptimDemo содержит следующие sub папки:

    for_redistribution
    for_redistribution_files_only
    for_testing

    Файлы, в которых вы будете нуждаться для остальной части примера, расположены в папке for_testing.

    Для получения дополнительной информации о работе с приложением Library Compiler смотрите, Генерируют Пакет Java и Сборку приложение Java.

  5. Запишите исходный код для класса, который реализует объектную функцию, чтобы оптимизировать. Код для этого примера находится в файле 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;
    	}
    }
    

    Класс реализует банановую функцию Розенброка, описанную в документации fminsearch MATLAB.

  6. Запишите исходный код для приложения, это получает доступ к функциям 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);.

    • Инстанцирует объекта Optimizer.

    • Вызывает метод displayObj, чтобы проверить, что объект Java передается правильно.

    • Вызывает метод doOptim, который использует fminsearch, чтобы найти локальный минимум целевой функции.

    • Использует блок try/catch, чтобы обработать исключения.

    • Освобождает нативные ресурсы с помощью методов MWArray.

  7. Скомпилируйте приложение PerformOptim.java и класс помощника BananaFunction.java с помощью команды Java javac. При вводе этой команды гарантируйте, что нет никаких пробелов между путями, разделенными точкой с запятой (;).

    1. Откройте Командную строку или Окно терминала и cd к папке work.

    2. Скомпилируйте приложение, согласно которой операционной системе вы работаете:

      Windows

      Чтобы скомпилировать BananaFunction.java, введите:

      javac -classpath .;
      c:\matlab\work\javabuilder.jar;
      c:\matlab\work\OptimDemo\for_testing\OptimDemo.jar BananaFunction.java
      Чтобы скомпилировать PerformOptim.java, введите:
      javac -classpath .;
      c:\matlab\work\javabuilder.jar;
      c:\matlab\work\OptimDemo\for_testing\OptimDemo.jar PerformOptim.java

      Linux

      Чтобы скомпилировать BananaFunction.java, введите:

      javac -classpath .:
      ~/matlab/work/javabuilder.jar:
      ~/matlab/work/OptimDemo/for_testing/OptimDemo.jar BananaFunction.java
      Чтобы скомпилировать PerformOptim.java, введите:
      javac -classpath .:
      ~/matlab/work/javabuilder.jar:
      ~/matlab/work/OptimDemo/for_testing/OptimDemo.jar PerformOptim.java

  8. Выполните файл класса PerformOptim можно следующим образом:

    На Windows введите:

    java -classpath .;
    c:\matlab\work\javabuilder.jar;
    c:\matlab\work\OptimDemo\for_testing\OptimDemo.jar PerformOptim -1.2 1.0 
    

    На Linux введите:

    java -classpath .:
    ~/matlab/work/javabuilder.jar: 
    ~/matlab/work/OptimDemo/for_testing/OptimDemo.jar PerformOptim -1.2 1.0
    

    Примечание

    Необходимо использовать ту же основную версию Java, который поставляется с MATLAB. Чтобы узнать, что запускает версия Java MATLAB, введите следующую команду MATLAB:

    version -java

    Примечание

    Если вы работаете на Mac 64-битная платформа, необходимо добавить флаг -d64 в команде Java. Смотрите Ограничения Цели MATLAB Compiler SDK Java для более определенной информации.

Когда запущено успешно, программа 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