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

Цель

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

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

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

    Примечание

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

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

Пакет OptimDemo

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

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

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

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

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

  • Два метода, doOptim и displayObj, инкапсулируйте функции MATLAB. Код MATLAB для этих двух методов в doOptim.m и displayObj.m, который можно найти в matlabroot\ toolbox\javabuilder\Примеры\Object Ref Example\Object Ref Demo Comp.

Необходимые условия

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

    Windows®: c:\matlab\work

    Linux®: ~/matlab/work

  • Если вы еще не сделали этого, задайте переменные окружения, которые требуются на машине разработки. Дополнительные сведения см. в разделе Настройка окружении Java.

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

    Файлы (файлы )ОтКому

    javabuilder.jar

    matlabroot\ toolbox\javabuilder\jar\win64

    Окна: c:\matlab\work

    Linux: ~/matlab/work

    doOptim.m

    displayObj.m

    matlabroot\ toolbox\javabuilder\Примеры\Object Ref Example\Object Ref Demo Comp

    Окна: c:\matlab\work

    Linux: ~/matlab/work

    BananaFunction.java

    PerformOptim.java

    matlabroot\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoJavaApp

    Окна: 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
    Имя класса:Optimizer
    Экспортированные функции (файлы для компиляции):doOptim.m и displayObj.m

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

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

    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;
    	}
    }
    

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

  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 класс с помощью командной javac Java. При вводе этой команды убедитесь, что между именами путей нет пространств, разделенных точкой с запятой (;).

    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

    Примечание

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

При успешном запуске 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