Преобразуйте данные между Java и MATLAB

Когда вы вызываете MATLAB® метод от сгенерированного класса на вашем Java® приложение, входные параметры, полученные методом, должно быть в формате внутреннего массива MATLAB. Можно или использовать manual conversion в рамках программы вызова при помощи экземпляров MWArray классы, или используют automatic conversion, храня ваши данные с помощью классов Java и типов данных, которые затем автоматически преобразованы механизмом вызова. Скорее всего, вы будете использовать комбинацию ручного и автоматического преобразования.

Например, рассмотрите следующий оператор Java:

result = theFourier.plotfft(3, data, Double.valueOf(interval));

Третий аргумент имеет тип java.lang.Double, который преобразован в MATLAB double 1 на 1 массив.

Автоматическое преобразование в типы MATLAB

Подпись вызова для метода, который инкапсулирует функцию MATLAB, использует один из классов преобразования данных MATLAB, чтобы передать аргументы ввода и вывода. Когда вы вызываете любой такой метод, все входные параметры, не выведенные из одного из MWArray классы автоматически преобразованы компилятором в правильный MWArray введите прежде чем быть переданным методу MATLAB.

Для таблиц, показывающих каждый тип Java наряду с его конвертированным типом MATLAB и каждым типом MATLAB с его конвертированным типом Java, см. Правила для Преобразования Данных Между Java и MATLAB.

Используйте MWNumericArray

getmagic программа (Интегрируют Простую функцию MATLAB В приложение Java) преобразует java.lang.Double аргумент к MWNumericArray введите, который может использоваться функцией MATLAB без дальнейшего преобразования:

n = new MWNumericArray(Double.valueOf(args[0]), MWClassID.DOUBLE);
theMagic = new Class1();
result = theMagic.makesqr(1, n);

Передайте Java, дважды возражают

Этот пример вызывает myprimes метод с двумя аргументами. Первое задает количество аргументов, чтобы возвратиться. Вторым является объект класса java.lang.Double это передает один ввод данных myprimes.

cls = new myclass();
y = cls.myprimes(1, Double.valueOf((double)n));

Компилятор преобразует java.lang.Double аргумент к MATLAB double 1 на 1 массив.

Передайте MWArray

Этот пример создает MWNumericArray из типа MWClassID.DOUBLE. Вызов myprimes передает количество выходных параметров, 1, и MWNumericArrayX.

x = new MWNumericArray(n, MWClassID.DOUBLE);
cls = new myclass();
y = cls.myprimes(1, x);

Компилятор преобразует MWNumericArray объект x к скаляру MATLAB double и передачи это к функции MATLAB.

Вызовите методы MWArray

Правила преобразования применяются не только когда вызов ваших собственных методов, но также и при вызове конструкторов и методов фабрики, принадлежащих MWArray классы.

Например, следующий фрагмент кода вызывает конструктора для MWNumericArray класс с Java double как входной параметр:

double Adata = 24;
MWNumericArray A = new MWnumericArray(Adata);
System.out.println("Array A is of type " + A.classID());
Array A is of type double

Компилятор преобразует входной параметр в экземпляр MWNumericArray с ClassID свойство MWClassID.DOUBLE. Этот MWNumericArray объект является эквивалентом MATLAB double 1 на 1 массив.

Возвратите данные от MATLAB до Java

Все данные, возвращенные в метод, закодированный в MATLAB, передаются как экземпляр соответствующего MWArray подкласс. Например, массив ячеек MATLAB возвращен в приложение Java как MWCellArray объект.

Возвратитесь данные не преобразованы в тип Java. Если вы принимаете решение использовать тип Java, необходимо преобразовать в тот тип с помощью toArray метод MWArray разделите на подклассы, которому принадлежат данные о возврате. Для получения дополнительной информации смотрите Использование toTypeArray Методы, чтобы Задать Тип и Размерность.

Примечание

Для получения информации о том, как работать непосредственно с массивами ячеек и структурами данных на нативном Java, смотрите Ячейку Represent Native Java и Массивы структур.

Ручное преобразование типов данных

Чтобы вручную преобразовать в один из стандартных типов данных MATLAB, используйте MWArray классы преобразования данных обеспечиваются MATLAB Compiler SDK™. Для ссылки класса и информации об использовании, смотрите com.mathworks.toolbox.javabuilder пакет.

Значение по умолчанию изменения путем определения типа

При вызове MWArray конструктор метода класса, предоставляя определенный тип данных заставляет MATLAB Compiler SDK преобразовывать в тот тип вместо значения по умолчанию.

Например, в следующем фрагменте кода, код задает тот A должен быть создан как MATLAB 16-битный целочисленный массив 1 на 1:

double Adata = 24;
MWNumericArray A = new MWnumericArray(Adata, MWClassID.INT16);
System.out.println("Array A is of type " + A.classID());
Array A is of type int16

Передайте переменные количества входных параметров

Рассмотрите следующую функцию MATLAB, которая возвращает сумму входных параметров:

function y = mysum(varargin)
y = sum([varargin{:}]);

Входные параметры обеспечиваются как varargin аргумент, что означает, что вызывающая сторона может задать любое количество входных параметров к функции. Результат возвращен как скалярный double.

MATLAB Compiler SDK генерирует следующий интерфейс Java к этой функции:

/* mlx interface - List version*/
public void mysum(List lhs, List rhs)
                          throws MWException
{
   (implementation omitted)
}
/* mlx interface - Array version*/
public void mysum(Object[] lhs, Object[] rhs)
                          throws MWException
{
   (implementation omitted)
}

/* standard interface - no inputs */
public Object[] mysum(int nargout) throws MWException
{
   (implementation omitted)
}

/* standard interface - variable inputs */
public Object[] mysum(int nargout, Object varargin)
                          throws MWException
{
   (implementation omitted)
}

Во всех случаях, varargin аргумент передается как тип Object, который позволяет вам обеспечить любое количество входных параметров в форме массива Объекта (Object[]). Содержимое этого массива передается скомпилированной функции MATLAB в порядке, в котором они появляются в массиве.

Вот пример того, как вы можете использовать mysum метод в программе Java:

public double getsum(double[] vals) throws MWException
{
   myclass cls = null;
   Object[] x = {vals};
   Object[] y = null;

   try
   {
      cls = new myclass();
      y = cls.mysum(1, x);
      return ((MWNumericArray)y[0]).getDouble(1);
   }

   finally
   {
      MWArray.disposeArray(y);
      if (cls != null)
	      cls.dispose();
   }
}

В этом примере вы создаете Object массив длины 1 и инициализирует его ссылкой на предоставленный double массив. Этот аргумент передается mysum метод. Результатом, как известно, является скалярный double, таким образом, код возвращает этот double значение с оператором:

return ((MWNumericArray)y[0]).getDouble(1);

Бросьте возвращаемое значение к MWNumericArray и вызовите getDouble(int) метод, чтобы возвратить первый элемент в массиве как примитивный double значение.

Передайте входные параметры массивов

Эта более общая версия getsum берет массив Object как введено и преобразует каждое значение в double массив. Список double массивы затем передаются mysum функция, где это вычисляет полную сумму каждого входного массива.

public double getsum(Object[] vals) throws MWException
{
   myclass cls = null;
   Object[] x = null;
   Object[] y = null;

   try
   {
      x = new Object[vals.length];
      for (int i = 0; i < vals.length; i++)
         x[i] = new MWNumericArray(vals[i], MWClassID.DOUBLE);

      cls = new myclass();
      y = cls.mysum(1, x);
      return ((MWNumericArray)y[0]).getDouble(1);
   }
   finally
   {
      MWArray.disposeArray(x);
      MWArray.disposeArray(y);
      if (cls != null)
         cls.dispose();
   }
}

Передайте переменное количество Выходных параметров

varargout аргументы обработаны таким же образом тот varargin аргументы обработаны. Рассмотрите следующую функцию MATLAB:

function varargout = randvectors

for i=1:nargout
   varargout{i} = rand(1, i);
end

Эта функция возвращает список случайного double векторизовал таким образом что длина iвектор th равен i. MATLAB Compiler SDK генерирует следующий интерфейс Java к этой функции:

/* mlx interface - List version */
 public void randvectors(List lhs, List rhs) throws MWException
{
   (implementation omitted)
}
/* mlx interface - Array version */
public void randvectors(Object[] lhs, 
           Object[] rhs) throws MWException
{
   (implementation omitted)
}
/* Standard interface - no inputs*/
public Object[] randvectors(int nargout) throws MWException
{
   (implementation omitted)
}

Передайте дополнительные аргументы со стандартным интерфейсом

Вот один способ использовать randvectors метод в программе Java:

 getrandvectors.java

getrandvectors метод возвращает двумерный double массив с треугольной структурой. Длина iстрока th равняется i. Такие массивы обычно упоминаются как зубчатые массивы. Зубчатые массивы легко поддерживаются на Java, потому что матрица Java является только массивом массивов.

Обработайте возвращаемые значения неизвестного типа

Предыдущие примеры использовали то, что вы знали тип и размерность выходного аргумента. Иногда, в программировании MATLAB, эта информация неизвестна или может варьироваться. В этом случае код, который вызывает метод, может должен быть запросить тип и размерность выходных аргументов.

Существует несколько способов сделать это:

  • Используйте отражательную поддержку на языке Java, чтобы запросить любой объект для его типа.

  • Используйте несколько методов, предоставленных MWArray класс, чтобы запросить информацию о базовом массиве MATLAB.

  • Задайте тип с помощью toTypeArray методы.

Используйте отражение Java, чтобы определить тип и размерность

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

Код вызывает myprimes метод и определяет тип с помощью отражения. Пример принимает, что выходной параметр возвращен как числовая матрица, но точный числовой тип неизвестен.

 getprimes.java Используя отражение

Используйте запрос MWArray, чтобы определить тип и размерность

Следующий пример использует MWArray classID метод, чтобы определить тип базового массива MATLAB. Это также проверяет размерность путем вызова numberOfDimensions. Если неожиданная информация возвращена, исключение выдается. Это затем проверяет MWClassID и процессы массив соответственно.

 getprimes.java Используя classID

Используйте toTypeArray Методы, чтобы Задать Тип и Размерность

Следующий пример демонстрирует, как можно принудить или обеспечить данные к заданному числовому типу путем вызова любого из toTypeМетоды массивов. Эти методы возвращают массив элементов Java типа, заданного от имени вызываемого метода. Данные принуждены или обеспечены к типу примитива, заданному в имени метода. Обратите внимание на то, что при использовании этих методов, данные будут усеченными при необходимости, чтобы позволить соответствие заданному типу данных.

 Задайте Тип Используя toTypeМетод массивов

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

Можно создать обертку кода MATLAB вокруг объектов Java с помощью MWJavaObjectRef, специальный подкласс MWArray. Используя этот метод, можно передать объекты в отношении функций MATLAB, клонировать объект Java в сгенерированном пакете, а также выполнить другой объект, упорядочивающий характерный для MATLAB Compiler SDK. Примеры в этом разделе представляют некоторые случаи общего использования.

Передайте объект Java в метод MATLAB Compiler SDK Java

Передать объект в метод MATLAB Compiler SDK Java:

  1. Используйте MWJavaObjectRef переносить ваш объект.

  2. Передайте свой объект функции MATLAB.

Например:

/* Create an object */
java.util.Hashtable<String,Integer> hash = 
                  new java.util.Hashtable<String,Integer>();
hash.put("One", 1);
hash.put("Two", 2);
System.out.println("hash: ");
System.out.println(hash.toString());
            
/* Create a MWJavaObjectRef to wrap this object */
origRef = new MWJavaObjectRef(hash);
            
/* Pass it to a MATLAB function that lists its methods, etc */
result = theComponent.displayObj(1, origRef);            
MWArray.disposeArray(origRef);

Клонируйте объект

Можно также использовать MWJavaObjectRef клонировать объект путем выполнения следующего:

  1. Добавьте к исходному хешу.

  2. Клонируйте объект.

  3. (Необязательно) Продолжите добавлять элементы в каждую копию.

Например:

origRef = new MWJavaObjectRef(hash);            
System.out.println("hash:");
System.out.println(hash.toString());
result = theComponent.addToHash(1, origRef);
            
outputRef = (MWJavaObjectRef)result[0];
            
/* We can typecheck that the reference contains a      */
/*        Hashtable but not <String,Integer>;          */
/* this can cause issues if we get a Hashtable<wrong,wrong>. */
java.util.Hashtable<String, Integer> outHash = 
          (java.util.Hashtable<String,Integer>)(outputRef.get());
            
/* We've added items to the original hash, cloned it, */
/* then added items to each copy */
System.out.println("hash:");
System.out.println(hash.toString());
System.out.println("outHash:");
System.out.println(outHash.toString());

 addToHash.m

Передайте дату в метод и получите дату из метода

В дополнение к передаче в созданных объектах можно также использовать MWJavaObjectRef передать вспомогательные объекты, такие как java.util.date.

  1. Получите текущую дату и время с помощью объекта Java java.util.date.

  2. Создайте экземпляр MWJavaObjectRef в который можно перенести объект Java.

  3. Передайте его функции MATLAB, которая выполняет последующую обработку, такую как nextWeek.m.

Например:

/* Get the current date and time */
java.util.Date nowDate = new java.util.Date();
System.out.println("nowDate:");
System.out.println(nowDate.toString());
            
/* Create a MWJavaObjectRef to wrap this object */
origRef = new MWJavaObjectRef(nowDate);
            
/* Pass it to a MATLAB function that calculates one week */
/* in the future */
result = theComponent.nextWeek(1, origRef);
            
outputRef = (MWJavaObjectRef)result[0];
java.util.Date nextWeekDate = 
      (java.util.Date)outputRef.get();
System.out.println("nextWeekDate:");
System.out.println(nextWeekDate.toString());

 nextWeek.m

Возвратите Объекты Java Используя unwrapJavaObjectRefs

Если вы хотите фактические объекты Java, возвращенные в метод, используйте unwrapJavaObjectRefs. Этот метод рекурсивно соединяет один MWJavaObjectRef или многомерный массив MWJavaObjectRef объекты к ссылке или массиву ссылок.

Следующие фрагменты кода показывают два примера вызова unwrapJavaObjectRefs:

 Возвратите одну ссылку или ссылку на массив объектов Используя unwrapJavaObjectRefs

 Возвращаемый массив ссылок Используя unwrapJavaObjectRefs

Пример оптимизации Используя MWJavaObjectRef

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

Смотрите также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте