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

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

См. Правила для Преобразования Данных Между.NET и MATLAB для полного списка правил преобразовать между типами данных MATLAB Compiler SDK™ и.NET.

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

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

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

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

  • Конструкторы и деструкторы, чтобы инстанцировать и избавиться от массивов MATLAB

  • Свойства добраться и установить данные массива

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

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

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

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

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

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

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

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

 Используйте Интерфейс feval

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

Когда существующий, аргументы 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.

Отражение.NET

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

Запрос MWArray

Следующий пример использует метод NumericType MWNumericArray, наряду с перечислением 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"); 
      }

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