Управление форматированием массивов и преобразованием данных

Обзор

Обычно следует записать код приложения так, чтобы он совпадал с аргументами (входными и выходными) MATLAB® функции, инкапсулированные в COM-объекты, которые вы используете. «отображение аргументов из продукта MATLAB в корпорацию Майкрософт»® Визуальный базовый® полностью описан в MATLAB в COM VARIANT Conversion Rules и COM VARIANT в MATLAB Conversion Rules.

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

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

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

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

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

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

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

OutputArrayFormat

mwArrayFormatAsIs

Массив Variant

Преобразует массивы согласно правилам преобразования по умолчанию, перечисленным в MATLAB, в COM VARIANT Conversion Rules.

mwArrayFormatMatrix

A Variant содержит массив базового типа.

mwArrayFormatCell

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

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

TransposeOutput

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

Используйте этот флаг при работе с инкапсулированной функцией MATLAB, выход является одномерным массивом. По умолчанию продукт MATLAB обрабатывает одномерные массивы как 1-by- 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.1 на 1 Variant, который содержит массив 2 на 2 Double
Результат преобразования компилятором согласно правилам преобразования данных по умолчанию массив ячеек 2 на 2. Каждый элемент является массивом double 1 на 1.Матрица 2 на 2. Каждый элемент является Double.

The 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 свойство class для изменения заданного поведения преобразования из Microsoft Visual Basic Variant типы к типам MATLAB и наоборот. Существуют некоторые исключения - у некоторых типов, сгенерированных компилятором, есть свои MWFlags свойство. При использовании этих типов вызов метода ведет себя в соответствии с настройками типа, а не класса, содержащего вызываемый метод. Исключения относятся к следующим типам, сгенерированным компилятором:

  • MWStruct

  • MWField

  • MWComplex

  • MWSparse

  • MWArg

Примечание

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