Когда вы вызываете метод на сгенерированный класс, входные параметры, полученные методом, должны быть в формате внутреннего массива MATLAB®. Можно или преобразовать их сами в рамках программы вызова или передать аргументы как типы данных Java®, которые затем автоматически преобразованы механизмом вызова.
Чтобы преобразовать их самостоятельно, используйте экземпляры MWArray
классы; в этом случае вы используете manual conversion. Хранение ваших данных с помощью классов и типов данных, заданных на языке Java, означает, что вы используете automatic conversion. Скорее всего, вы будете использовать комбинацию ручного и автоматического преобразования.
Чтобы вручную преобразовать в один из стандартных типов данных MATLAB, используйте MWArray
классы преобразования данных обеспечиваются компилятором. Для ссылки класса и информации об использовании, смотрите com.mathworks.toolbox.javabuilder
пакет.
Пример Магического квадрата (Интегрируют Пакет 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
, и MWNumericArray
X
:
x = new MWNumericArray(n, MWClassID.DOUBLE); cls = new myclass(); y = cls.myprimes(1, x);
Джейва-Бридж преобразует MWNumericArray
возразите против скаляра MATLAB double
передать функции 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 массив.
Пример вызывает myprimes
метод с двумя аргументами. Первое задает количество аргументов, чтобы возвратиться. Вторым является объект класса java.lang.Double
это передает один ввод данных myprimes
.
cls = new myclass(); y = cls.myprimes(1, new Double((double)n));
Этот второй аргумент преобразован в MATLAB double
1 на 1 массив, как требуется функцией MATLAB. Это - правило преобразования по умолчанию для
java.lang.Double
.
Этот пример создает MWNumericArray
из типа MWClassID.DOUBLE
. Вызов myprimes
передает количество выходных параметров, 1
, и MWNumericArray
X
.
x = new MWNumericArray(n, MWClassID.DOUBLE); cls = new myclass(); y = cls.myprimes(1, x);
Компилятор преобразует MWNumericArray
возразите против скаляра 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());
Компилятор преобразует входной параметр в экземпляр 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.
Принуждение к определенному типу с помощью to
Type
Array
методы.
Этот пример кода вызывает 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
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(); } }
Следующий пример демонстрирует, как можно принудить или обеспечить данные к заданному числовому типу путем вызова любого из 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); }