Существует много экземпляров, когда вы, возможно, должны преобразовать различные собственные типы данных в типы, совместимые с MATLAB®. Используйте этот раздел в качестве инструкции к выполнению некоторых из этих основных задач.
См. Правила для Преобразования Данных Между.NET и MATLAB для полного списка правил преобразовать между типами данных MATLAB Compiler SDK™ и.NET.
Чтобы поддержать преобразование данных между управляемыми типами и типами MATLAB, MATLAB Compiler SDK обеспечивает набор классов преобразования данных, выведенных из абстрактного класса, MWArray.
MWArray классы преобразования данных позволяют вам передавать большинство нативных типов значения.NET как параметры непосредственно, не используя явное преобразование данных. Существует неявный оператор броска для большинства нативных числовых и строковых типов, которые преобразуют нативный тип в соответствующий массив MATLAB.
Когда вы вызываете метод на компонент, параметры ввода и вывода являются производным типом MWArray. Чтобы передать параметры, можно или инстанцировать одного из MWArray подклассы явным образом, или, во многих случаях, передают параметры как managed data type и используют неявную функцию преобразования данных MATLAB Compiler SDK.
Чтобы поддержать типы данных MATLAB, продукт MATLAB Compiler SDK обеспечивает MWArray классы преобразования данных в MWArray сборка. Вы ссылаетесь на этот блок в своем управляемом приложении, чтобы преобразовать нативные массивы в массивы MATLAB и наоборот.
См. документацию API MWArray для полного изложения на классах и предоставленных методах.
Классы преобразования данных создаются как иерархия классов, которая представляет главные типы массива MATLAB.
Примечание
Для получения информации об этих классах преобразования данных см. Справочник по библиотеке классов MWArray MATLAB, доступный в папка, где matlabroot\help\dotnetbuilder\MWArrayAPImatlabroot представляет вашу папку установки MATLAB
Корнем иерархии является MWArray абстрактный класс. MWArray класс имеет следующие подклассы, представляющие главные типы MATLAB: MWNumericArray, MWLogicalArray, MWCharArray, MWCellArray, и MWStructArray.
MWArray и его производные классы обеспечивают следующую функциональность:
Конструкторы и деструкторы, чтобы инстанцировать и избавиться от массивов MATLAB
Свойства добраться и установить данные массива
Индексаторы, чтобы поддержать подмножество индексации массива MATLAB
Неявные и явные операторы преобразования данных
Общие методы
Примечание
Поскольку процесс преобразования является обычно автоматическим, вы не должны изучать процесс преобразования, чтобы передать и возвращаемые аргументы с блоками.NET MATLAB Compiler SDK.
В большинстве экземпляров, если нативный примитивный.NET или массив используется в качестве входного параметра в программе C#, продукт MATLAB Compiler SDK прозрачно преобразует его в экземпляр соответствующего MWArray класс, прежде чем это будет передано сгенерированному методу. Продукт MATLAB Compiler SDK может преобразовать большую часть CLS-совместимой строки, числового типа или многомерного массива этих типов к соответствующему MWArray ввод.
Примечание
Это преобразование прозрачно в приложениях C#, но может потребовать явного оператора кастинга на других языках, например, op_implicit в визуальном Basic®.
Вот пример. Рассмотрите оператор.NET:
result = theFourier.plotfft(3, data, interval);
В этом операторе третий аргумент, а именно, interval, имеет собственный тип.NET System.Double. Продукт MATLAB Compiler SDK бросает этот аргумент в MATLAB, 1 на 1 удваивают MWNumericArray введите (который является классом обертки, содержащим двойной массив MATLAB).
См. Правила для Преобразования Данных Между.NET и MATLAB для списка всех типов данных, которые поддерживаются наряду с их эквивалентными типами в продукте MATLAB.
Примечание
Существуют некоторые типы данных, обычно используемые в продукте MATLAB, которые не доступны как нативные типы.NET. Примерами являются массивы ячеек, массивы структур и массивы комплексных чисел. Представляйте эти типы массива как экземпляры MWCellArray, MWStructArray, и MWNumericArray, соответственно.
MATLAB и.NET реализуют различные стратегии индексации многомерных массивов. Когда вы создаете переменную типа MWNumericArray, MATLAB автоматически создает эквивалентный массив, используя его собственную внутреннюю индексацию. Например, индексы MATLAB с помощью этой схемы:
(row column page1 page2 ...)
(... page2 page1 row column)
Учитывая многомерный MATLAB myarr:
>> myarr(:,:,1) = [1, 2, 3; 4, 5, 6];
>> myarr(:,:,2) = [7, 8, 9; 10, 11, 12];
>> myarr
myarr(:,:,1) =
1 2 3
4 5 6
myarr(:,:,2) =
7 8 9
10 11 12
Вы закодировали бы этот эквивалент на.NET:
double[,,] myarr = {{{1.000000, 2.000000, 3.000000},
{4.000000, 5.000000, 6.000000}}, {{7.000000, 8.000000,
9.000000}, {10.000000, 11.000000, 12.000000}}};
Продукт MATLAB Compiler SDK обеспечивает классы массивов MATLAB для того, чтобы упростить преобразование данных между нативными данными и скомпилированными функциями MATLAB.
Этот пример явным образом создает числовое постоянное использование конструктора для MWNumericArray класс с System.Int32 аргумент. Эта переменная может затем быть передана одному из сгенерированных методов.NET.
int data = 24;
MWNumericArray array = new MWNumericArray(data);
Console.WriteLine("Array is of type " + array.NumericType);Когда вы запускаете этот пример, результаты:
Array is of type double
В этом примере, нативное целое число (int data) преобразован в MWNumericArray содержа двойной массив MATLAB 1 на 1, который является типом MATLAB по умолчанию.
Совет
Чтобы сохранить целочисленный тип, используйте MWNumericArray конструктор, который обеспечивает способность управлять автоматическим преобразованием.
MWNumericArray array = new MWNumericArray(data, false);
Продукт MATLAB Compiler SDK не поддерживает некоторые типы массива MATLAB, потому что они не CLS-совместимы. Смотрите Неподдерживаемые Типы массива MATLAB для списка неподдерживаемых типов.
Для получения дополнительной информации о концепциях, вовлеченных в преобразование данных, смотрите Проблемы Преобразования Данных об Управлении с Классами Преобразования Данных о.NET MATLAB Compiler SDK.
Если вы хотите создать числовой массив MATLAB определенного типа, установите дополнительный makeDouble аргумент к False. Нативный тип затем определяет тип массива MATLAB, который создается.
Здесь, код указывает, что массив должен быть создан как MATLAB 16-битный целочисленный массив 1 на 1:
short data = 24;
MWNumericArray array = new MWNumericArray(data, false);
Console.WriteLine("Array is of type " + array.NumericType);
Выполнение этого примера приводит к следующим результатам:
Array is of type int16
В продукте MATLAB, varargin и varargout используются, чтобы задать аргументы, которые не требуются. Рассмотрите следующую функцию MATLAB:
function y = mysum(varargin)
y = sum([varargin{:}]);
Эта функция возвращает сумму входных параметров. Входные параметры обеспечиваются как varargin, что означает, что вызывающая сторона может задать любое количество входных параметров к функции. Результат возвращен как скалярный double массив.
Для mysum функция, продукт MATLAB Compiler SDK генерирует следующие интерфейсы:
// Single output interfaces
public MWArray mysum()
public MWArray mysum(params MWArray[] varargin)
// Standard interface
public MWArray[] mysum(int numArgsOut)
public MWArray[] mysum(int numArgsOut,
params MWArray[] varargin)
// feval interface
public void mysum(int numArgsOut, ref MWArray ArgsOut,
params MWArray[] varargin)
varargin аргументы могут быть переданы как любой MWArray[], или как список явных входных параметров. (В C#, params модификатор для аргумента метода указывает, что метод принимает любое количество параметров определенного типа.) Используя params позволяет вашему коду добавлять любое количество дополнительных входных параметров к инкапсулированной функции MATLAB.
Вот пример того, как вы можете использовать один выходной интерфейс mysum метод в приложении.NET:
static void Main(string[] args]
{
MWArray sum= null;
MySumClass mySumClass = null;
try
{
mySumClass= new MySumClass();
sum= mySumClass.mysum((double)2, 4);
Console.WriteLine("Sum= {0}", sum);
sum= mySumClass.mysum((double)2, 4, 6, 8);
Console.WriteLine("Sum= {0}", sum);
}
}
Количество входных параметров может варьироваться.
Примечание
Для этой конкретной подписи необходимо явным образом бросить первый аргумент к MWArray или тип кроме целого числа. Выполнение этого отличает подпись от сигнатуры метода, которая берет целое число в качестве первого аргумента. Если первый аргумент явным образом не брошен к MWArray или как тип кроме целого числа, аргумент может быть ошибочным как представление количества выходных аргументов.
Когда существующий, varargout аргументы обработаны таким же образом тот varargin аргументы обработаны. Рассмотрите следующую функцию MATLAB:
function varargout = randvectors()
for i=1:nargout
varargout{i} = rand(1, i);
end
Эта функция возвращает список случайного double векторизовал таким образом что длина iвектор th равен i. Продукт MATLAB Compiler SDK генерирует интерфейс.NET к этой функции можно следующим образом:
public void randvectors() public MWArray[] randvectors(int numArgsOut) public void randvectors(int numArgsOut, ref MWArray[] varargout)
Предыдущие примеры показывают инструкции, чтобы использовать, если вы знаете тип и размерность выходного аргумента. Иногда, в программировании MATLAB, эта информация неизвестна, или может варьироваться. В этом случае код, который вызывает метод, может должен быть запросить тип и размерность выходных аргументов.
Существует два способа сделать запрос:
Используйте отражение.NET, чтобы запросить любой объект для его типа.
Используйте любой из нескольких методов, предоставленных MWArray класс, чтобы запросить информацию о базовом массиве MATLAB.
Можно использовать reflection, чтобы динамически создать экземпляр типа, связать тип с существующим объектом или получить тип от существующего объекта. Можно затем вызвать методы типа или получить доступ к его полям и свойствам. Смотрите MSDN Library для получения дополнительной информации об отражении.
Следующий пример кода вызывает myprimes метод, и затем определяет тип с помощью отражения. Пример принимает, что выходной параметр возвращен как числовой векторный массив, но точный числовой тип неизвестен.
public void GetPrimes(int n)
{
MWArray primes= null;
MyPrimesClass myPrimesClass= null;
try
{
myPrimesClass= new MyPrimesClass();
primes= myPrimesClass.myprimes((double)n);
Array primesArray= ((MWNumericArray)primes).
ToVector(MWArrayComponent.Real);
if (primesArray is double[])
{
double[] doubleArray= (double[])primesArray;
/* Do something with doubleArray . . . */
}
else if (primesArray is float[])
{
float[] floatArray= (float[])primesArray;
/* Do something with floatArray . . . */
}
else if (primesArray is int[])
{
int[] intArray= (int[])primesArray;
/*Do something with intArray . . . */
}
else if (primesArray is long[])
{
long[] longArray= (long[])primesArray;
/*Do something with longArray . . . */
}
else if (primesArray is short[])
{
short[] shortArray= (short[])primesArray;
/*Do something with shortArray . . . */
}
else if (primesArray is byte[])
{
byte[] byteArray= (byte[])primesArray;
/*Do something with byteArray . . . */
}
else
{
throw new ApplicationException("
Bad type returned from myprimes");
}
}
}Пример использует toVector метод, чтобы возвратить.NET примитивный массив (primesArray), который представляет базовый массив MATLAB. Смотрите следующий фрагмент кода из примера:
primes= myPrimesClass.myprimes((double)n); Array primesArray= ((MWNumericArray)primes). ToVector(MWArrayComponent.Real);
Примечание
toVector метод MWNumericArray класс. Это возвращает копию компонента массивов в упорядоченном по столбцам порядке. Тип элементов массива определяется по условию тип числового массива.
Следующий пример использует MWNumericArray NumericType метод, наряду с MWNumericType перечисление, чтобы определить тип базового массива MATLAB. Смотрите switch (numericType) оператор.
public void GetPrimes(int n)
{
MWArray primes= null;
MyPrimesClass myPrimesClass= null;
try
{
myPrimesClass= new MyPrimesClass();
primes= myPrimesClass.myprimes((double)n);
if ((!primes.IsNumericArray) || (2 !=
primes.NumberofDimensions))
{
throw new ApplicationException("Bad type returned
by mwprimes");
}
MWNumericArray _primes= (MWNumericArray)primes;
MWNumericType numericType= _primes.NumericType;
Array primesArray= _primes.ToVector(
MWArrayComponent.Real);
switch (numericType)
{
case MWNumericType.Double:
{
double[] doubleArray= (double[])primesArray;
/* (Do something with doubleArray . . .) */
break;
}
case MWNumericType.Single:
{
float[] floatArray= (float[])primesArray;
/* (Do something with floatArray . . .) */
break;
}
case MWNumericType.Int32:
{
int[] intArray= (int[])primesArray;
/* (Do something with intArray . . .) */
break;
}
case MWNumericType.Int64:
{
long[] longArray= (long[])primesArray;
/* (Do something with longArray . . .) */
break;
}
case MWNumericType.Int16:
{
short[] shortArray= (short[])primesArray;
/* (Do something with shortArray . . .) */
break;
}
case MWNumericType.UInt8:
{
byte[] byteArray= (byte[])primesArray;
/* (Do something with byteArray . . .) */
break;
}
default:
{
throw new ApplicationException("Bad type returned
by myprimes");
}
}
}
}Код в примере также проверяет размерность путем вызова NumberOfDimensions; смотрите следующий фрагмент кода:
if ((!primes.IsNumericArray) || (2 !=
primes.NumberofDimensions))
{
throw new ApplicationException("Bad type returned
by mwprimes");
}
Этот вызов выдает исключение, если массив не является числовым и соответствующей размерности.