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

MATLAB® Продукт Compiler SDK™ обеспечивает MWArray блок, чтобы упростить преобразование данных между нативными данными и скомпилированными функциями MATLAB. Для получения информации о классах преобразования данных смотрите Маршалинг данных с API MWArray.

Обратитесь к следующим примерам для инструкций по тому, как упорядочить данные между нативным.NET и типами данных MATLAB.

Примечание

Объекты данных, которые просто проходят или через цель или через среды 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 и.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}}}; 

Пример MWNumericArray

Вот фрагмент кода, который показывает, как преобразовать double значение (5.0) к MWNumericArray ввод:

MWNumericArray arraySize = 5.0;
magicSquare = magic.MakeSqr(arraySize);

После преобразования и присвоения double значение к переменной arraySize, можно использовать arraySize аргумент с основанным на MATLAB методом без дальнейшего преобразования. В этом примере основанным на MATLAB методом является magic.MakeSqr(arraySize).

Задайте тип массива

Если вы хотите создать числовой массив 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)

В этом примере вы используете стандартный интерфейс и запрашиваете два выходных аргумента.

MyVarargOutClass myClass = new MyVarargOutClass();
MWArray[] results = myClass.randvectors(2);
Console.WriteLine("First output= {0}", results[0]);
Console.WriteLine("Second output= {0}", results[1]);

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

Следующие примеры показывают сгенерированный код для myprimes Функция MATLAB, которая имеет следующее определение:

function p = myprimes(n) 
p = primes(n);

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

Следующий пример кода создает data как MWNumericArray быть переданным как входной параметр:

MWNumericArray data = 5;
MyPrimesClass myClass = new MyPrimesClass();
MWArray primes = myClass.myprimes(data);

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

Этот пример передает нативный двойной тип функции.

MyPrimesClass myClass = new MyPrimesClass();
MWArray primes = myClass.myprimes((double)13);

Входной параметр преобразован в MATLAB двойной массив 1 на 1, как требуется функцией MATLAB. Это - правило преобразования по умолчанию для нативного двойного типа. Для обсуждения преобразования данных по умолчанию для всех поддерживаемых типов.NET см. Правила для Преобразования Данных Между.NET и MATLAB.

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

feval взаимодействуйте через интерфейс передает оба аргумента ввода и вывода на правой стороне вызова функции. Выходной аргумент primes должен предшествоваться ref атрибут.

MyPrimesClassmyClass = new MyPrimesClass(); 
MWArray[] maxPrimes = new MWArray[1]; 
maxPrimes[0] = new MWNumericArray(13);
MWArray[] primes = new MWArray[1];
myClass.myprimes(1, ref primes, maxPrimes);

Тип запроса возвращаемого значения

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

Существует два способа сделать запрос:

  • Используйте отражение.NET, чтобы запросить любой объект для его типа.

  • Используйте любой из нескольких методов, предоставленных MWArray класс, чтобы запросить информацию о базовом массиве MATLAB.

Отражение.NET

Можно использовать reflection, чтобы динамически создать экземпляр типа, связать тип с существующим объектом или получить тип от существующего объекта. Можно затем вызвать методы типа или получить доступ к его полям и свойствам. Для получения дополнительной информации об отражении смотрите MSDN Library.

Следующий пример кода вызывает myprimes метод и затем определяет тип с помощью отражения. Пример принимает, что выходной параметр возвращен как числовой векторный массив, но точный числовой тип неизвестен.

 GetPrimes Используя отражение.NET

Пример использует toVector метод, чтобы возвратить.NET примитивный массив (primesArray), который представляет базовый массив MATLAB. Смотрите следующий фрагмент кода из примера:

primes= myPrimesClass.myprimes((double)n);
		Array primesArray= ((MWNumericArray)primes).
			ToVector(MWArrayComponent.Real);

toVector метод MWNumericArray класс. Это возвращает копию компонента массивов в упорядоченном по столбцам порядке. Тип элементов массива определяется по условию тип числового массива.

Запрос MWArray

Этот пример использует MWNumericArray NumericType метод, наряду с MWNumericType перечисление, чтобы определить тип базового массива MATLAB. Смотрите switch (numericType) оператор.

 GetPrimes Используя запрос MWArray

Код в примере также проверяет размерность путем вызова NumberOfDimensions; смотрите следующий фрагмент кода:

if ((!primes.IsNumericArray) || (2 !=
			primes.NumberofDimensions))
		 {
			throw new ApplicationException("Bad type returned
				by mwprimes"); 
      }

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

Передайте объекты ссылкой

MWObjectArray, специальный подкласс MWArray, позволяет вам создать массив MATLAB тот.NET ссылок объекты.

Можно создать обертку кода MATLAB вокруг объектов.NET с помощью MWObjectArray. Используйте этот метод, чтобы передать объекты в отношении функций MATLAB и возвратить объекты.NET. Примеры в этом разделе представляют некоторые случаи общего использования.

Передайте объект.NET в блок.NET

Передать объект в блок MATLAB Compiler SDK:

  1. Запишите функцию MATLAB, которая ссылается на тип.NET.

    function addItem(hDictionary, key, value)
    
           if ~isa(hDictionary,'System.Collections.Generic.IDictionary')
               error('foo:IncorrectType', 
                 ... 'expecting a System.Collections.Generic.Dictionary');
           end 
         
           hDictionary.Add(key, value);
     
         end

  2. Создайте объект.NET передать функции MATLAB.

         Dictionary char2Ascii= new Dictionary();
         char2Ascii.Add("A", 65);
         char2Ascii.Add("B", 66);
    
  3. Создайте экземпляр MWObjectArray переносить объект.NET.

    MWObjectArray MWchar2Ascii= 
               new MWObjectArray(char2Ascii);
    
  4. Передайте перенесенный объект функции MATLAB.

    myComp.addItem(MWchar2Ascii,'C', 67);
    

Возвратите пользовательский объект.NET в функции MATLAB Используя развернутый блок.NET

Можно использовать MWObjectArray клонировать объект в блоке.NET MATLAB Compiler SDK. Продолжая предыдущий пример, выполните следующие шаги:

  1. Запишите функцию MATLAB, которая ссылается на тип.NET.

     function result= add(hMyDouble, value)
    
           if ~isa(hMyDouble,'MyDoubleComp.MyDouble')
              error('foo:IncorrectType', 'expecting a MyDoubleComp.MyDouble');
           end
           hMyDoubleClone= hMyDouble.Clone();
           result= hMyDoubleClone.Add(value);
     
         end
    
  2. Создайте объект.

    MyDouble myDouble= new MyDouble(75);
    
  3. Создайте экземпляр MWObjectArray переносить объект.NET.

    MWObjectArray MWdouble= new MWObjectArray(myDouble);
                origRef = new MWObjectArray(hash);

  4. Передайте перенесенный объект функции MATLAB и получите возвращенный клонированный объект.

    MWObjectArray result= 
                (MWObjectArray)myComp.add(MWdouble, 25);
  5. Разверните.NET, возражают и распечатывают результат.

    MyDouble doubleClone= (MyDouble)result.Object;
    
         Console.WriteLine(myDouble.ToDouble());
         Console.WriteLine(doubleClone.ToDouble());
    

Клонируйте MWObjectArray

При вызове Clone метод на MWObjectArray, следующие правила касаются перенесенного объекта:

  • Если перенесенным объектом является ValueType, это глубоко скопировано.

  • Если объектом не является ValueType и реализации ICloneable, Clone метод для объекта называется.

  • MemberwiseClone метод называется на перенесенном объекте.

MWObjectArray aDate = new MWObjectArray(new 
                        DateTime(1, 1, 2010));
MWObjectArray clonedDate = aDate.Clone();

Оптимизация Используя MWObjectArray

Для полного примера того, как использовать MWObjectArray чтобы создать ссылку на объект.NET и передать его компоненту, смотрите, Интегрируют Стандартные программы Оптимизации MATLAB с Целевыми функциями.

MWObjectArray и домены приложения

Каждое веб-приложение.NET ASP, развернутое на IIS, запускается в отдельном AppDomain.

Интерфейс.NET MATLAB должен поддержать тип.NET, перенесенный MWObjectArray. Если MWObjectArray создается в AppDomain по умолчанию, перенесенный тип не имеет никаких других ограничений.

Если MWObjectArray не создается в AppDomain по умолчанию, перенесенный тип.NET должен быть сериализуемым. Это ограничение наложено тем, что объект должен быть упорядочен от AppDomain не по умолчанию к AppDomain по умолчанию для MATLAB, чтобы получить доступ к нему.

Ограничение MWObjectArray

Если у вас будут какие-либо глобальные объекты в вашем коде C#, то вы получите Windows® исключение при выходе из приложения. Чтобы преодолеть это ограничение, используйте одно из этих решений:

  • Явным образом очистите глобальные объекты прежде, чем выйти из приложения.

    globalObj.Destroy();

  • Вызовите TerminateApplicationEx метод прежде, чем выйти из приложения.

    MWMCR.TerminateApplicationEx();

    Для получения дополнительной информации о TerminateApplicationEx, см. Справочник по библиотеке классов MWArray.

Доступ к действительным или мнимым компонентам в комплексных массивах

Экстракция компонента

Когда вы получаете доступ к комплексному массиву (массив, составленный и из действительных и из мнимых данных), вы извлекаете и действительные и мнимые части (названный компонентами) по умолчанию. Этот вызов метода извлекает и действительные и мнимые компоненты:

MWNumericArray complexResult= complexDouble[1, 2];
Также возможно извлечь только действительный или мнимый компонент комплексной матрицы путем вызова соответствующего метода component indexing.

Индексация компонента на комплексных числовых массивах

Чтобы возвратить действительный или мнимый компонент в полный комплексный числовой массив, вызовите .real или .imaginary метод на MWArrayComponent.

complexResult= complexDouble[MWArrayComponent.Real, 1, 2];
complexResult= complexDouble[MWArrayComponent.Imaginary, 1, 2];

Чтобы присвоить действительный или мнимый компонент полному комплексному числовому массиву, вызовите .real или .imaginary метод на MWArrayComponent.

matrix[MWArrayComponent.Real, 2, 2]= 5;
matrix[MWArrayComponent.Imaginary, 2, 2]= 7:

Можно возвратить действительный или мнимый компонент в разреженный комплексный числовой массив в Microsoft® Visual Studio® 8 и позже.

complexResult= sparseComplexDouble[MWArrayComponent.Real, 4, 3];
complexResult = sparseComplexDouble[MWArrayComponent.Imaginary, 4, 3];

Преобразуйте массивы MATLAB в массивы.NET

Чтобы преобразовать массивы MATLAB в массивы.NET вызывают toArray метод с любым .real или .imaginary метод на MWArrayComponent.

Array nativeArray_real= matrix.ToArray(MWArrayComponent.Real);
Array nativeArray_imag= matrix.ToArray(MWArrayComponent.Imaginary);

Преобразуйте массивы MATLAB в векторы.NET

Чтобы преобразовать векторы MATLAB в векторы.NET (один массивы размерности) вызывают .real или .imaginary метод на MWArrayComponent.

Array nativeArray= sparseMatrix.ToVector(MWArrayComponent.Real);
Array nativeArray= sparseMatrix.ToVector(MWArrayComponent.Imaginary);

Зубчатая обработка матриц

jagged array является массивом, элементами которого являются массивы. Элементы зубчатого массива могут иметь различные размерности и размеры, в противоположность элементам non–jagged array, элементы которого имеют те же размерности и размер.

Веб-сервисы, в частности, обрабатывают данные почти исключительно в зубчатых массивах.

MWNumericArrays может только обработать зубчатые массивы с прямоугольной формой.

В следующем фрагменте кода, прямоугольном зубчатом массиве типа int инициализируется и заполняется.

int[][] jagged = new int[5][]; 
for (int i = 0; i < 5; i++) 
    jagged[i] = new int[10]; 
MWNumericArray jaggedMWArray = new MWNumericArray(jagged); 
Console.WriteLine(jaggedMWArray); 

Похожие темы