exponenta event banner

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

Цель

Цель этого примера - показать, как:

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

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

    Примечание

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

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

Пакет OptimDemo

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

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

  • Класс Optimizer выполняет неограниченную нелинейную оптимизацию целевой функции, реализованной как объект 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

    Окна: c:\matlab\work

    Linux: ~/matlab/work

    doOptim.m

    displayObj.m

    matlabroot\toolbox\javabuilder\Examples\ObjectRefExample\ObjectRefDemoComp

    Окна: 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 , чтобы открыть приложение Компилятор библиотеки.

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

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

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

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

    for_redistribution
    for_redistribution_files_only
    for_testing

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

    Дополнительные сведения о работе с приложением компилятора библиотеки см. в разделах Создание пакета 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 helper class с помощью команды 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

    Примечание

    При работе на 64-разрядной платформе Mac необходимо добавить -d64 в команде Java. Более подробную информацию см. в разделе Ограничения целевого пакета SDK Java компилятора MATLAB.

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