MATLAB® Продукт Compiler SDK™ обеспечивает MWArray
блок, чтобы упростить преобразование данных между нативными данными и скомпилированными функциями MATLAB. Для получения информации о классах преобразования данных смотрите Маршалинг данных с API MWArray.
Обратитесь к следующим примерам для инструкций по тому, как упорядочить данные между нативным.NET и типами данных 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 ...)
(... 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}}};
Вот фрагмент кода, который показывает, как преобразовать 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);
Этот пример передает нативный двойной тип функции.
MyPrimesClass myClass = new MyPrimesClass();
MWArray primes = myClass.myprimes((double)13);
Входной параметр преобразован в MATLAB двойной массив 1 на 1, как требуется функцией MATLAB. Это - правило преобразования по умолчанию для нативного двойного типа. Для обсуждения преобразования данных по умолчанию для всех поддерживаемых типов.NET см. Правила для Преобразования Данных Между.NET и MATLAB.
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.
Можно использовать reflection, чтобы динамически создать экземпляр типа, связать тип с существующим объектом или получить тип от существующего объекта. Можно затем вызвать методы типа или получить доступ к его полям и свойствам. Для получения дополнительной информации об отражении смотрите MSDN Library.
Следующий пример кода вызывает myprimes
метод и затем определяет тип с помощью отражения. Пример принимает, что выходной параметр возвращен как числовой векторный массив, но точный числовой тип неизвестен.
GetPrimes Используя отражение.NET
Пример использует toVector
метод, чтобы возвратить.NET примитивный массив (primesArray
), который представляет базовый массив MATLAB. Смотрите следующий фрагмент кода из примера:
primes= myPrimesClass.myprimes((double)n);
Array primesArray= ((MWNumericArray)primes).
ToVector(MWArrayComponent.Real);
toVector
метод MWNumericArray
класс. Это возвращает копию компонента массивов в упорядоченном по столбцам порядке. Тип элементов массива определяется по условию тип числового массива.
Этот пример использует 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. Примеры в этом разделе представляют некоторые случаи общего использования.
Передать объект в блок MATLAB Compiler SDK:
Запишите функцию 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
Создайте объект.NET передать функции MATLAB.
Dictionary char2Ascii= new Dictionary();
char2Ascii.Add("A", 65);
char2Ascii.Add("B", 66);
Создайте экземпляр MWObjectArray
переносить объект.NET.
MWObjectArray MWchar2Ascii=
new MWObjectArray(char2Ascii);
Передайте перенесенный объект функции MATLAB.
myComp.addItem(MWchar2Ascii,'C', 67);
Можно использовать MWObjectArray
клонировать объект в блоке.NET MATLAB Compiler SDK. Продолжая предыдущий пример, выполните следующие шаги:
Запишите функцию 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
Создайте объект.
MyDouble myDouble= new MyDouble(75);
Создайте экземпляр MWObjectArray
переносить объект.NET.
MWObjectArray MWdouble= new MWObjectArray(myDouble);
origRef = new MWObjectArray(hash);
Передайте перенесенный объект функции MATLAB и получите возвращенный клонированный объект.
MWObjectArray result= (MWObjectArray)myComp.add(MWdouble, 25);
Разверните.NET, возражают и распечатывают результат.
MyDouble doubleClone= (MyDouble)result.Object;
Console.WriteLine(myDouble.ToDouble());
Console.WriteLine(doubleClone.ToDouble());
При вызове Clone
метод на MWObjectArray
, следующие правила касаются перенесенного объекта:
Если перенесенным объектом является ValueType
, это глубоко скопировано.
Если объектом не является ValueType
и реализации ICloneable
, Clone
метод для объекта называется.
MemberwiseClone
метод называется на перенесенном объекте.
MWObjectArray aDate = new MWObjectArray(new
DateTime(1, 1, 2010));
MWObjectArray clonedDate = aDate.Clone();
Для полного примера того, как использовать MWObjectArray
чтобы создать ссылку на объект.NET и передать его компоненту, смотрите, Интегрируют Стандартные программы Оптимизации MATLAB с Целевыми функциями.
Каждое веб-приложение.NET ASP, развернутое на IIS, запускается в отдельном AppDomain
.
Интерфейс.NET MATLAB должен поддержать тип.NET, перенесенный MWObjectArray
. Если MWObjectArray
создается в AppDomain
по умолчанию, перенесенный тип не имеет никаких других ограничений.
Если MWObjectArray
не создается в AppDomain
по умолчанию, перенесенный тип.NET должен быть сериализуемым. Это ограничение наложено тем, что объект должен быть упорядочен от
AppDomain
не по умолчанию к
AppDomain
по умолчанию для MATLAB, чтобы получить доступ к нему.
Если у вас будут какие-либо глобальные объекты в вашем коде C#, то вы получите Windows® исключение при выходе из приложения. Чтобы преодолеть это ограничение, используйте одно из этих решений:
Явным образом очистите глобальные объекты прежде, чем выйти из приложения.
globalObj.Destroy();
Вызовите TerminateApplicationEx
метод прежде, чем выйти из приложения.
MWMCR.TerminateApplicationEx();
Для получения дополнительной информации о TerminateApplicationEx
, см. Справочник по библиотеке классов MWArray.
Когда вы получаете доступ к комплексному массиву (массив, составленный и из действительных и из мнимых данных), вы извлекаете и действительные и мнимые части (названный компонентами) по умолчанию. Этот вызов метода извлекает и действительные и мнимые компоненты:
MWNumericArray complexResult= complexDouble[1, 2];
Чтобы возвратить действительный или мнимый компонент в полный комплексный числовой массив, вызовите .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 вызывают toArray
метод с любым .real
или .imaginary
метод на MWArrayComponent
.
Array nativeArray_real= matrix.ToArray(MWArrayComponent.Real);
Array nativeArray_imag= matrix.ToArray(MWArrayComponent.Imaginary);
Чтобы преобразовать векторы MATLAB в векторы.NET (один массивы размерности) вызывают .real
или .imaginary
метод на MWArrayComponent
.
Array nativeArray= sparseMatrix.ToVector(MWArrayComponent.Real);
Array nativeArray= sparseMatrix.ToVector(MWArrayComponent.Imaginary);
jagged array является массивом, элементами которого являются массивы. Элементы зубчатого массива могут иметь различные размерности и размеры, в противоположность элементам non–jagged array, элементы которого имеют те же размерности и размер.
Веб-сервисы, в частности, обрабатывают данные почти исключительно в зубчатых массивах.
MWNumericArray
s может только обработать зубчатые массивы с прямоугольной формой.
В следующем фрагменте кода, прямоугольном зубчатом массиве типа 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);