Существует много образцов, когда вам может потребоваться преобразовать различные собственные типы данных в типы, совместимые с MATLAB®. Используйте этот раздел в качестве руководства для выполнения некоторых из этих основных задач.
Полный список правил для преобразования типов данных .NET и MATLAB см. в разделе «Правила преобразования данных между .NET и MATLAB Compiler SDK™».
Чтобы поддержать преобразование данных между управляемыми типами и типами MATLAB, MATLAB Compiler SDK предоставляет набор классов преобразования данных, полученных из абстрактного класса, MWArray
.
The MWArray
классы преобразования данных позволяют вам передавать большинство собственных типов значений .NET как параметры непосредственно, не используя явное преобразование данных. Существует неявный оператор приведения для большинства собственных числовых и строковых типов, который преобразует собственный тип в соответствующий массив MATLAB.
Когда вы вызываете метод для компонента, входные и выходные параметры являются производным типом MWArray
. Чтобы передать параметры, можно либо создать экземпляр одного из MWArray
подклассы явно, или, во многих случаях, передают параметры как managed data type и полагаются на функцию неявного преобразования данных MATLAB Compiler SDK.
Для поддержки типов данных MATLAB, продукт MATLAB Compiler SDK предоставляет MWArray
классы преобразования данных в MWArray
сборки. Вы ссылаетесь на эту сборку в своем управляемом приложении для преобразования собственных массивов в массивы MATLAB и наоборот.
Подробную информацию о предоставленных классах и методах см. в документации MWArray API.
Классы преобразования данных строятся как иерархия классов, которая представляет основные типы массивов MATLAB.
Примечание
Для получения информации об этих классах преобразования данных смотрите MATLAB MWArray Class Ссылка, доступный в
папка, где matlabroot
\ help\dotnetbuilder\MWArrayAPImatlabroot
представляет вашу папку установки MATLAB
Корнем иерархии являются MWArray
абстрактный класс. The MWArray
класс имеет следующие подклассы, представляющие основные типы MATLAB: MWNumericArray
, MWLogicalArray
, MWCharArray
, MWCellArray
, и MWStructArray
.
MWArray
и его производные классы обеспечивают следующую функциональность:
Конструкторы и деструкторы для создания экземпляров и удаления массивов MATLAB
Свойства, чтобы получить и задать данные массива
Индексаторы для поддержки подмножества индексации массива MATLAB
Неявные и явные операторы преобразования данных
Общие методы
Примечание
Поскольку процесс преобразования обычно автоматический, вам не нужно понимать процесс преобразования, чтобы передать и возвращаемые аргументы с сборками MATLAB Compiler SDK .NET.
В большинстве случаев, если собственный примитив .NET или массив используется в качестве входного параметра в программе C #, продукт MATLAB Compiler SDK прозрачно преобразует его в образец соответствующего MWArray
класс перед его передачей сгенерированному методу. Продукт MATLAB Compiler SDK может преобразовать большинство строковых, числовых или многомерных массивов этих типов в соответствующее MWArray
тип.
Примечание
Это преобразование прозрачно в приложениях C #, но может потребовать явного оператора литья на других языках, например op_implicit
в Visual Basic®.
Вот пример. Рассмотрим .NET заявление:
result = theFourier.plotfft(3, data, interval);
В этом операторе третий аргумент, а именно interval
, относится к собственному типу .NET System.Double
. Продукт MATLAB Compiler SDK помещает этот аргумент в MATLAB 1 на 1 double MWNumericArray
type (который является классом обертки, содержащим двойной массив MATLAB).
Список всех типов данных, поддерживаемых вместе с эквивалентными типами в продукте MATLAB, см. в разделе «Правила преобразования данных между .NET и MATLAB».
Примечание
Некоторые типы данных, обычно используемые в продукте MATLAB, недоступны в качестве собственных типов .NET. Примерами являются массивы ячеек, массивы структур и массивы комплексных чисел. Представьте эти типы массивов как образцы MWCellArray
, MWStructArray
, и MWNumericArray
, соответственно.
MATLAB и .NET реализуют различные стратегии индексации для многомерных массивов. Когда вы создаете переменную типа MWNumericArray
MATLAB автоматически создает эквивалентный массив, используя собственную внутреннюю индексацию. Для примера, индексы MATLAB, использующие эту схему:
(row column page1 page2 ...)
(... page2 page1 row column)
Учитывая многомерные myarr MATLAB
:
>> 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 см. в разделе неподдерживаемых типов.
Дополнительные сведения о концепциях преобразования данных см. в разделе Управление проблемами преобразования данных с классами преобразования данных MATLAB Compiler SDK .NET.
Если вы хотите создать числовой массив MATLAB определенного типа, установите дополнительное makeDouble
аргумент в False
. Затем собственный тип определяет тип созданного массива MATLAB.
Здесь код указывает, что массив должен быть построен как 16-битный целочисленный массив MATLAB 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)
The 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.
Следующая выборка кода вызывает 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);
Примечание
The 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"); }
Этот вызов выдает исключение, если массив не является числовым и соответствующей размерности.