Когда вы вызываете метод в сгенерированном классе, входные параметры, полученные методом, должны быть в 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);
Мост Java преобразует MWNumericArray объект для скалярного double MATLAB для перехода к функции MATLAB.
При передаче аргумента только небольшое количество раз, обычно так же эффективно передавать примитивный тип Java или объект. В этом случае механизм вызова преобразует данные для вас в эквивалентный тип MATLAB.
Например, любой из следующих типов Java автоматически преобразуется в MATLAB double тип:
A 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 1 на 1 double массив.
Пример вызывает myprimes метод с двумя аргументами. Первый определяет количество возвращаемых аргументов. Второй - объект класса java.lang.Double который передает один вход данных в myprimes.
cls = new myclass(); y = cls.myprimes(1, new Double((double)n));
Этот второй аргумент преобразуется в MATLAB 1 на 1 double массив, как требуется функцией 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 объект для скалярного double MATLAB для перехода к функции 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 1 на 1 double массив.
Когда вы запускаете этот пример, результат следующий:
Array A is of type double
При вызове MWArray конструктор метода класса, предоставление определенного типа данных приводит к преобразованию продукта SDK™ MATLAB Compiler в этот тип вместо типа по умолчанию.
Для примера в следующем фрагменте кода код задает, что A должно быть построено как 16-битный целочисленный массив MATLAB 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 векторы такие, что длина ith вектор равен 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();
}
}
The getrandvectors метод возвращает двумерное double массив с треугольной структурой. Длина iвторая строка равна i. Такие массивы обычно называются зубчатыми массивами. Jagged arrays легко поддерживаются в Java, потому что Java- матрица - это всего лишь массив массивов.
В предыдущих примерах использовался тот факт, что вы знали тип и размерность выходного аргумента. В случае, если эта информация неизвестна или может варьироваться (как это возможно при программировании MATLAB), коду, который вызывает метод, может потребоваться запросить тип и размерность выходных аргументов.
Есть несколько способов сделать это. Выполните одно из следующих действий:
Используйте поддержку отражения на языке Java, чтобы запросить любой объект для его типа.
Используйте несколько методов, предоставленных MWArray класс, чтобы запросить информацию об базовом массиве MATLAB.
Принуждение к определенному типу с помощью toTypeArray методы.
Эта выборка кода вызывает 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. The 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();
}
}
Следующий пример демонстрирует, как можно принудительно или принудительно преобразовать данные в заданный числовой тип путем вызова любого из TypeМетоды Array. Эти методы возвращают массив элементов 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);
}