exponenta event banner

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

Обзор

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

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

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

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

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

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

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

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

OutputArrayFormat

mwArrayFormatAsIs

Массив Variant

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

mwArrayFormatMatrix

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

mwArrayFormatCell

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

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

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. Каждый элемент является массивом 1 на 1 double.Матрица 2 на 2. Каждый элемент является Double.

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

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

aClass .MWFlags.ArrayFormatFlags.InputArrayFormat = 
mwArrayFormatCell

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

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

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

Формат вывода в VASEcript

При вызове COM-объекта в VASEcript необходимо убедиться, что установлен 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

Примечание

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