Преобразование данных между .NET и MATLAB

Существует много образцов, когда вам может потребоваться преобразовать различные собственные типы данных в типы, совместимые с MATLAB®. Используйте этот раздел в качестве руководства для выполнения некоторых из этих основных задач.

Полный список правил для преобразования типов данных .NET и MATLAB см. в разделе «Правила преобразования данных между .NET и MATLAB Compiler SDK™».

Управление проблемами преобразования данных с помощью классов преобразования данных MATLAB Compiler SDK .NET

Чтобы поддержать преобразование данных между управляемыми типами и типами 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\MWArrayAPI папка, где matlabroot представляет вашу папку установки MATLAB

Корнем иерархии являются MWArray абстрактный класс. The MWArray класс имеет следующие подклассы, представляющие основные типы MATLAB: MWNumericArray, MWLogicalArray, MWCharArray, MWCellArray, и MWStructArray.

MWArray и его производные классы обеспечивают следующую функциональность:

  • Конструкторы и деструкторы для создания экземпляров и удаления массивов MATLAB

  • Свойства, чтобы получить и задать данные массива

  • Индексаторы для поддержки подмножества индексации массива 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

MATLAB и .NET реализуют различные стратегии индексации для многомерных массивов. Когда вы создаете переменную типа MWNumericArrayMATLAB автоматически создает эквивалентный массив, используя собственную внутреннюю индексацию. Для примера, индексы MATLAB, использующие эту схему:

(row column page1 page2 ...)
в то время как .NET индексирует следующим образом:
(... 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

Собственное преобразование данных

Продукт 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 или как тип, отличный от целого, аргумент может быть ошибочно принят как представляющий количество выходных аргументов.

 Передайте входные параметры

 Создайте один входной параметр

 Передайте собственный тип .NET

 Используйте feval Interface

Передайте переменное количество выходов

Когда присутствует, varargout аргументы обрабатываются так же, как и varargin обрабатываются аргументы. Рассмотрите следующую функцию MATLAB:

function varargout = randvectors()
for i=1:nargout
   varargout{i} = rand(1, i);
end

Эта функция возвращает список случайных double векторы такие, что длина ith вектор равен 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.

Отражение .NET

Можно использовать 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 класс. Он возвращает копию компонента массива в основном порядке столбца. Тип элементов массива определяется типом данных числового массива.

Запрос MWArray

В следующем примере используется 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"); 
      }

Этот вызов выдает исключение, если массив не является числовым и соответствующей размерности.

Для просмотра документации необходимо авторизоваться на сайте