Форматирование контрольного массива и преобразование данных

Панорама

Обычно необходимо записать код приложения так, чтобы он совпадал с аргументами (ввод и вывод) функций MATLAB®, которые инкапсулируются в COM-объектах, которые вы используете. Отображение аргументов от продукта MATLAB до Microsoft® Visual Basic® полностью описано в MATLAB к Правилам Преобразования ВАРИАНТА COM и ВАРИАНТУ COM к Правилам Преобразования MATLAB.

В некоторых случаях не возможно совпадать с двумя видами аргументов точно; например, когда существующий код MATLAB используется в сочетании со сторонним продуктом, таким как Microsoft Excel®. Для этих и других случаев, форматирования поддержек компилятора и флагов преобразования, которые управляют, как данные массива отформатированы в обоих направлениях (ввод и вывод).

Когда это создает компонент, компилятор включает свойство компонентов под названием MWFlags. MWFlags свойство читаемо и перезаписываемо.

MWFlags свойство состоит из двух наборов констант: arrayformattingflags и dataconversionflags. Флаги форматирования массивов влияют на преобразование массивов, тогда как преобразование данных отмечает соглашение с преобразованиями типов отдельных элементов массива.

Флаги форматирования массивов

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

Имя флагаВозможные значения флагаРезультаты преобразования
InputArrayFormat mwArrayFormatMatrix (значение по умолчанию)Матрица MATLAB от общего Variant данные.
mwArrayFormatCellМассив ячеек MATLAB от общего Variant данные.

Данные массива от Excel range закодирован в Visual Basic как массив Variant. Поскольку функции MATLAB обычно имеют матричные аргументы, использование настройки по умолчанию целесообразно, когда вы имеете дело с данными из Excel.

OutputArrayFormat

mwArrayFormatAsIs

Массив Variant

Преобразует массивы согласно правилам преобразования по умолчанию, перечисленным в MATLAB к Правилам Преобразования ВАРИАНТА COM.

mwArrayFormatMatrix

Variant содержа массив основного типа.

mwArrayFormatCell

Массив ячеек MATLAB от общего Variant данные.
AutoResizeOutput

Когда этот флаг установлен, целевой диапазон автоматически изменяет размер, чтобы соответствовать полученному массиву. Если этот флаг не установлен, целевой диапазон должен быть, по крайней мере, столь же большим как выходной массив, или данные являются усеченными. Используйте этот флаг в Excel Range объекты передали непосредственно как выходные параметры.

TransposeOutput

Транспонирует весь массив выход.

Используйте этот флаг при контакте с инкапсулированной функцией MATLAB, выход которой является одномерным массивом. По умолчанию продукт MATLAB обрабатывает одномерные массивы как 1 n матрицы (то есть, как векторы-строки). Измените это значение по умолчанию с TransposeOutput отметьте, если вы предпочитаете столбец выход.

Используя флаги форматирования массивов

Рассмотрите следующее определение функции Microsoft Visual Basic для foo:

Sub foo( )
   Dim aClass As mycomponent.myclass
   Dim var1(1 To 2, 1 To 2), var2 As Variant
   Dim x(1 To 2, 1 To 2) As Double
   Dim y1,y2 As Variant
   
   On Error Goto Handle_Error
   var1(1,1) = 11#
   var1(1,2) = 12#
   var1(2,1) = 21#
   var1(2,2) = 22#
   x(1,1) = 11
   x(1,2) = 12
   x(2,1) = 21
   x(2,2) = 22
   var2 = x
   Set aClass = New mycomponent.myclass
   Call aClass.foo(1,y1,var1)
   Call aClass.foo(1,y2,var2)
   Exit Sub
Handle_Error:
   MsgBox(Err.Description)
End Sub

Пример имеет два Variant переменные, var1 и var2. Эти две переменные содержат те же числовые данные, но внутренне они структурированы по-другому; каждый - массив 2 на 2 variant и другой массив 1 на 1 variant. Переменные описаны в следующей таблице.

Сценарийvar1var2
Числовые данные
11    12
21    22
11    12
21    22
Внутренняя структура в Visual BasicМассив 2 на 2 Variant. Каждый variant массив 1 на 1 Double.Variant 1 на 1, который содержит массив 2 на 2 Double
Результат преобразования компилятором согласно правилам преобразования данных по умолчанию Массив ячеек 2 на 2. Каждым элементом является массив 1 на 1 double.Матрица 2 на 2. Каждым элементом является Double.

InputArrayFormat отметьте средства управления, как массивы обработаны. В этом примере, значении для InputArrayFormat флаг является значением по умолчанию, которое является mwArrayFormatMatrix. Значение по умолчанию заставляет массив быть преобразованным в матрицу. См. таблицу для результата преобразования var2.

Чтобы задать массив ячеек (вместо матрицы), как введено к вызову функции, установите InputArrayFormat отметьте к mwArrayFormatCell вместо значения по умолчанию. Сделайте это в этом примере путем добавления следующей линии после создания класса и перед вызовом метода:

aClass .MWFlags.ArrayFormatFlags.InputArrayFormat = 
mwArrayFormatCell

Установка флага к mwArrayFormatCell причины весь вход массивов к инкапсулированной функции MATLAB, которая будет преобразована в массивы ячеек.

Изменение выходного формата

Точно так же можно управлять форматом выходных аргументов с помощью OutputArrayFormat флаг. Можно также изменить массив выход с AutoResizeOutput и TransposeOutput флаги.

Выходной формат в VBScript

При вызове COM-объекта в VBScript необходимо убедиться, что вы устанавливаете MWFlags для COM-объекта задать массив ячеек для выхода. Кроме того, необходимо использовать перечисление (перечислимая величина для массива ячеек равняется 2), чтобы сделать спецификацию (вместо того, чтобы задать mwArrayFormatCell).

Следующий пример кода показывает, как выполнить это:

obj.MWFlags.ArrayFormatFlags.OutputArrayFormat = 2

Используя флаги преобразования данных

Два флага преобразования данных, CoerceNumericToType и InputDateFormat, управляйте, как числовой и типы даты преобразованы от Visual Basic до MATLAB.

Этот пример преобразует var1 из типа Variant/Integer к int16 и var2 из типа Variant/Double к double.

Sub foo( )
   Dim aClass As mycomponent.myclass
   Dim var1, var2 As Variant
   Dim y As Variant
   
   On Error Goto Handle_Error
   var1 = 1
   var2 = 2#
   Set aClass = New mycomponent.myclass
   Call aClass.foo(1,y,var1,var2)
   Exit Sub
Handle_Error:
   MsgBox(Err.Description)
End Sub

Если исходная функция MATLAB ожидает doubles для обоих аргументов, этот код может вызвать ошибку. Одно решение состоит в том, чтобы присвоить double к var1, но это не может быть возможно или желательно. Как альтернатива, можно установить CoerceNumericToType отметьте к mwTypeDouble, то, чтобы заставлять преобразователь данных преобразовать весь числовой вход в double. Для этого поместите следующую линию после создания класса и прежде, чем вызвать методы:

aClass .MWFlags.DataConversionFlags.CoerceNumericToType = 
mwTypeDouble

Следующий пример показывает, как использовать InputDateFormat отметьте, который управляет как Visual Basic Date тип преобразован. Пример отправляет текущую дату и время как входной параметр и преобразует его в строку.

Sub foo( )
   Dim aClass As mycomponent.myclass
   Dim today As Date
   Dim y As Variant
   
   On Error Goto Handle_Error
   today = Now
   Set aClass = New mycomponent.myclass
   aClass. MWFlags.DataConversionFlags.InputDateFormat = 
mwDateFormatString
   Call aClass.foo(1,y,today)
   Exit Sub
Handle_Error:
   MsgBox(Err.Description)
End Sub

Следующий пример использует MWArg объект изменить флаги преобразования для одного аргумента в вызове метода. В этом случае первый выходной аргумент (y1) принужден к Date, и второй выходной аргумент (y2) использует текущие флаги преобразования по умолчанию, предоставленные aClass.

Sub foo(y1 As Variant, y2 As Variant)
    Dim aClass As mycomponent.myclass
    Dim ytemp As MWArg
	Dim today As Date

	On Error Goto Handle_Error
	today = Now
	Set aClass = New mycomponent.myclass
	Set ytemp = New MWArg
	ytemp.MWFlags.DataConversionFlags.OutputAsDate = True
	Call aClass.foo(2, ytemp, y2, today)
	y1 = ytemp
	Exit Sub
Handle_Error:
	MsgBox(Err.Description)
End Sub

Специальные флаги для некоторых типов Microsoft Visual Basic

В общем случае вы используете MWFlags свойство класса изменить заданные поведения преобразования из Microsoft Visual Basic Variant типы к типам MATLAB, и наоборот. Существуют некоторые исключения — некоторые типы, сгенерированные компилятором, имеют свой собственный MWFlags свойство. Когда вы используете эти конкретные типы, вызов метода ведет себя согласно настройкам типа а не класса, содержащего названный метод. Исключения для следующих типов, сгенерированных компилятором:

  • MWStruct

  • MWField

  • MWComplex

  • MWSparse

  • MWArg

Примечание

MWArg класс предоставляется специально для случая, когда конкретному аргументу нужны различные настройки из свойств класса по умолчанию.

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