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

Обзор

Обычно необходимо записать код приложения так, чтобы он совпадал с аргументами (ввод и вывод) функций MATLAB®, которые инкапсулируются в COM-объектах, которые вы используете. Отображение аргументов от продукта MATLAB до Microsoft® Visual Basic® полностью описано в MATLAB к Правилам Преобразования COM VARIANT и COM VARIANT к Правилам Преобразования 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 VARIANT.

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. Можно также изменить массив вывод с флагами TransposeOutput и AutoResizeOutput.

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