Когда вы вызываете 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, чтобы передать аргументы ввода и вывода. Когда вы вызываете любой такой метод, все входные параметры, не выведенные из одного из MWArray
классы автоматически преобразованы компилятором в правильный MWArray
введите прежде чем быть переданным методу MATLAB.
Для таблиц, показывающих каждый тип Java наряду с его конвертированным типом MATLAB и каждым типом MATLAB с его конвертированным типом Java, см. Правила для Преобразования Данных Между Java и MATLAB.
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);
Этот пример вызывает myprimes
метод с двумя аргументами. Первое задает количество аргументов, чтобы возвратиться. Вторым является объект класса java.lang.Double
это передает один ввод данных myprimes
.
cls = new myclass();
y = cls.myprimes(1, Double.valueOf((double)n));
Компилятор преобразует java.lang.Double
аргумент к MATLAB double
1 на 1 массив.
Этот пример создает MWNumericArray
из типа MWClassID.DOUBLE
. Вызов myprimes
передает количество выходных параметров, 1
, и MWNumericArray
X
.
x = new MWNumericArray(n, MWClassID.DOUBLE); cls = new myclass(); y = cls.myprimes(1, x);
Компилятор преобразует MWNumericArray
объект x
к скаляру MATLAB double
и передачи это к функции MATLAB.
Правила преобразования применяются не только когда вызов ваших собственных методов, но также и при вызове конструкторов и методов фабрики, принадлежащих 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, передаются как экземпляр соответствующего 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
метод возвращает двумерный double
массив с треугольной структурой. Длина i
строка th равняется i
. Такие массивы обычно упоминаются как зубчатые массивы. Зубчатые массивы легко поддерживаются на Java, потому что матрица Java является только массивом массивов.
Предыдущие примеры использовали то, что вы знали тип и размерность выходного аргумента. Иногда, в программировании MATLAB, эта информация неизвестна или может варьироваться. В этом случае код, который вызывает метод, может должен быть запросить тип и размерность выходных аргументов.
Существует несколько способов сделать это:
Используйте отражательную поддержку на языке Java, чтобы запросить любой объект для его типа.
Используйте несколько методов, предоставленных MWArray
класс, чтобы запросить информацию о базовом массиве MATLAB.
Задайте тип с помощью to
Type
Array
методы.
Этот пример использует toArray
метод, чтобы возвратить Java примитивный массив, представляющий базовый массив MATLAB. toArray
метод работает точно так же, как getData
в предыдущих примерах, за исключением того, что возвращенный массив имеет ту же размерность как базовый массив MATLAB.
Код вызывает myprimes
метод и определяет тип с помощью отражения. Пример принимает, что выходной параметр возвращен как числовая матрица, но точный числовой тип неизвестен.
Следующий пример использует MWArray
classID
метод, чтобы определить тип базового массива MATLAB. Это также проверяет размерность путем вызова numberOfDimensions
. Если неожиданная информация возвращена, исключение выдается. Это затем проверяет MWClassID
и процессы массив соответственно.
Следующий пример демонстрирует, как можно принудить или обеспечить данные к заданному числовому типу путем вызова любого из toType
Методы массивов. Эти методы возвращают массив элементов Java типа, заданного от имени вызываемого метода. Данные принуждены или обеспечены к типу примитива, заданному в имени метода. Обратите внимание на то, что при использовании этих методов, данные будут усеченными при необходимости, чтобы позволить соответствие заданному типу данных.
Можно создать обертку кода MATLAB вокруг объектов Java с помощью MWJavaObjectRef
, специальный подкласс MWArray
. Используя этот метод, можно передать объекты в отношении функций MATLAB, клонировать объект Java в сгенерированном пакете, а также выполнить другой объект, упорядочивающий характерный для MATLAB Compiler SDK. Примеры в этом разделе представляют некоторые случаи общего использования.
Передать объект в метод MATLAB Compiler SDK Java:
Используйте MWJavaObjectRef
переносить ваш объект.
Передайте свой объект функции 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
клонировать объект путем выполнения следующего:
Добавьте к исходному хешу.
Клонируйте объект.
(Необязательно) Продолжите добавлять элементы в каждую копию.
Например:
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());
В дополнение к передаче в созданных объектах можно также использовать MWJavaObjectRef
передать вспомогательные объекты, такие как java.util.date
.
Получите текущую дату и время с помощью объекта Java java.util.date
.
Создайте экземпляр MWJavaObjectRef
в который можно перенести объект Java.
Передайте его функции 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());
Если вы хотите фактические объекты Java, возвращенные в метод, используйте unwrapJavaObjectRefs
. Этот метод рекурсивно соединяет один MWJavaObjectRef
или многомерный массив MWJavaObjectRef
объекты к ссылке или массиву ссылок.
Следующие фрагменты кода показывают два примера вызова unwrapJavaObjectRefs
:
Возвратите одну ссылку или ссылку на массив объектов Используя unwrapJavaObjectRefs
Для полного примера того, как использовать MWJavaObjectRef
чтобы создать ссылку на объект Java и передать его методу, смотрите Объекты Передачи Java к MATLAB.