Передайте аргументы и из Java

Формат

Когда вы вызываете метод на сгенерированный класс, входные параметры, полученные методом, должны быть в формате внутреннего массива MATLAB®. Можно или преобразовать их сами в рамках программы вызова или передать аргументы как типы данных Java®, которые затем автоматически преобразованы механизмом вызова.

Чтобы преобразовать их самостоятельно, используйте экземпляры MWArray классы; в этом случае вы используете manual conversion. Хранение ваших данных с помощью классов и типов данных, заданных на языке Java, означает, что вы используете automatic conversion. Скорее всего, вы будете использовать комбинацию ручного и автоматического преобразования.

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

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

Используя MWNumericArray

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

n = new MWNumericArray(Double.valueOf(args[0]),
                                      MWClassID.DOUBLE);

         theMagic = new Class1();

         result = theMagic.makesqr(1, n);

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

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

Джейва-Бридж преобразует MWNumericArray возразите против скаляра MATLAB double передать функции MATLAB.

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

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

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

  • Java double примитивный

  • Объект класса java.lang.Double

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

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

При вызове makesqr метод используется в getmagic приложение, вы могли создать объект типа MWNumericArray. Выполнение так было бы примером ручного преобразования. Вместо этого вы могли использовать автоматическое преобразование, как показано в следующем фрагменте кода:

result = M.makesqr(1, arg[0]);

В этом случае, Java double передается как arg[0].

Вот другой пример:

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

В этом операторе Java третий аргумент имеет тип java.lang.Double. Согласно правилам преобразования, java.lang.Double автоматически преобразует в MATLAB double 1 на 1 массив.

Передача Java дважды возражает

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

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

Этот второй аргумент преобразован в MATLAB double 1 на 1 массив, как требуется функцией MATLAB. Это - правило преобразования по умолчанию для java.lang.Double.

Передача MWArray

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

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

Компилятор преобразует MWNumericArray возразите против скаляра 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());

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

Когда вы запускаете этот пример, результат следующие:

Array A is of type double

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

При вызове 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, которые имеют varargin или varargout аргументы. Рассмотрите следующую функцию 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 значение.

Передайте Входные параметры Массивов.  Следующий пример выполняет более общее вычисление:

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

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

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

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

function varargout = randvectors

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

Эта функция возвращает список случайного double векторизовал таким образом что длина iвектор th равен i. Продукт MATLAB Compiler™ генерирует интерфейс 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:

public double[][] getrandvectors(int n) throws MWException
{
   myclass cls = null;
   Object[] y = null;

   try
   {
      cls = new myclass();
      y = cls.randvectors(n);
      double[][] ret = new double[y.length][];

      for (int i = 0; i < y.length; i++)
         ret[i] = (double[])((MWArray)y[i]).getData();
      return ret;
   }

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

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

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

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

Существует несколько способов сделать это. Выполнить одно из следующих действий:

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

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

  • Принуждение к определенному типу с помощью toTypeArray методы.

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

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

public void getprimes(int n) throws MWException
{
   myclass cls = null;
   Object[] y = null;

   try
   {
      cls = new myclass();
      y = cls.myprimes(1, new Double((double)n));
      Object a = ((MWArray)y[0]).toArray();

      if (a instanceof double[][])
      {
         double[][] x = (double[][])a;

         /* (do something with x...) */
      }

      else if (a instanceof float[][])
      {
         float[][] x = (float[][])a;

         /* (do something with x...) */
      }

      else if (a instanceof int[][])
      {
         int[][] x = (int[][])a;

         /* (do something with x...) */
      }

      else if (a instanceof long[][])
      {
         long[][] x = (long[][])a;

         /* (do something with x...) */
      }

      else if (a instanceof short[][])
      {
         short[][] x = (short[][])a;

         /* (do something with x...) */
      }

      else if (a instanceof byte[][])
      {
         byte[][] x = (byte[][])a;

         /* (do something with x...) */
      }

      else
      {
         throw new MWException(
            "Bad type returned from myprimes");
      }
   }

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

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

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

public void getprimes(int n) throws MWException
{
   myclass cls = null;
   Object[] y = null;

   try
   {
      cls = new myclass();
      y = cls.myprimes(1, new Double((double)n));
      MWClassID clsid = ((MWArray)y[0]).classID();

      if (!clsid.isNumeric() ||
         ((MWArray)y[0]).numberOfDimensions() != 2)
      {
         throw new MWException("Bad type 
                          returned from myprimes");
      }

      if (clsid == MWClassID.DOUBLE)
      {
         double[][] x = (double[][])((MWArray)y[0]).toArray();

         /* (do something with x...) */
      }

      else if (clsid == MWClassID.SINGLE)
      {
         float[][] x = (float[][])((MWArray)y[0]).toArray();

         /* (do something with x...) */
      }

      else if (clsid == MWClassID.INT32 || 
              clsid == MWClassID.UINT32)
      {
         int[][] x = (int[][])((MWArray)y[0]).toArray();

         /* (do something with x...) */
      }

      else if (clsid == MWClassID.INT64 || 
              clsid == MWClassID.UINT64)
      {
         long[][] x = (long[][])((MWArray)y[0]).toArray();

         /* (do something with x...) */
      }

      else if (clsid == MWClassID.INT16 || 
              clsid == MWClassID.UINT16)
      {
         short[][] x = (short[][])((MWArray)y[0]).toArray();

         /* (do something with x...) */
      }

      else if (clsid == MWClassID.INT8 || 
              clsid == MWClassID.UINT8)
      {
         byte[][] x = (byte[][])((MWArray)y[0]).toArray();

         /* (do something with x...) */
      }
   }
   finally
   {
      MWArray.disposeArray(y);
      if (cls != null)
         cls.dispose();
   }
}

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

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

Object results = null;
try {
    // call a compiled MATLAB function
    results = myobject.myfunction(2);

    // first output is known to be a numeric matrix
    MWArray resultA = (MWNumericArray) results[0];
   double[][] a = (double[][]) resultA.toDoubleArray();

    // second output is known to be 
    //    a 3-dimensional numeric array
    MWArray resultB = (MWNumericArray) results[1];
   int[][][] b = (int[][][]) resultB.toIntArray();   
}
 finally {
    MWArray.disposeArray(results);
}
Для просмотра документации необходимо авторизоваться на сайте