Как правило, следует написать код приложения таким образом, чтобы он соответствовал аргументам (входным и выходным) функций 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 | ||
OutputArrayFormat |
| Массив Variant |
Преобразует массивы в соответствии с правилами преобразования по умолчанию, перечисленными в разделе MATLAB, в правила преобразования COM VARIANT. | ||
| A Variant содержит массив базового типа. | |
| Массив ячеек MATLAB из общего Variant данные. | |
AutoResizeOutput | При установке этого флажка целевой диапазон автоматически изменяется в соответствии с размером результирующего массива. Если этот флаг не установлен, целевой диапазон должен быть по крайней мере таким же большим, как выходной массив, или данные усечены. Использовать этот флаг для Excel | |
TransposeOutput |
Транспонирует все выходные данные массива. Этот флаг используется при работе с инкапсулированной функцией MATLAB, выходом которой является одномерный массив. По умолчанию продукт MATLAB обрабатывает одномерные массивы как 1-by- | |
Рассмотрим следующее определение функции 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. Переменные описаны в следующей таблице.
| Сценарий | var1 | var2 |
|---|---|---|
| Числовые данные | 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 флаги.
При вызове 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
В общем, вы используете MWFlags свойство class для изменения указанного поведения преобразования из Microsoft Visual Basic Variant типы для типов MATLAB и наоборот. Есть некоторые исключения - некоторые типы, сгенерированные компилятором, имеют свои собственные MWFlags собственность. При использовании этих типов вызов метода ведет себя в соответствии с параметрами типа, а не класса, содержащего вызываемый метод. Исключения относятся к следующим типам, созданным компилятором:
MWStruct
MWField
MWComplex
MWSparse
MWArg
Примечание
MWArg класс предоставляется специально для случая, когда для конкретного аргумента требуются параметры, отличные от свойств класса по умолчанию.