Существует много экземпляров, когда вы, возможно, должны преобразовать различные собственные типы данных в типы, совместимые с 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"); }
Этот вызов выдает исключение, если массив не является числовым и соответствующей размерности.