Обычно следует записать код приложения так, чтобы он совпадал с аргументами (входными и выходными) 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 данные. | |
Данные массива из | ||
OutputArrayFormat |
| Массив Variant |
Преобразует массивы согласно правилам преобразования по умолчанию, перечисленным в MATLAB, в COM VARIANT Conversion Rules. | ||
| A Variant содержит массив базового типа. | |
| Массив ячеек MATLAB из общих Variant данные. | |
AutoResizeOutput | Когда этот флаг установлен, целевая область значений автоматически изменяется, чтобы соответствовать полученному массиву. Если этот флаг не установлен, целевая область значений должен быть по крайней мере таким же большим, как выходной массив или данные усечены. Используйте этот флаг для | |
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. Каждый элемент является массивом double 1 на 1 . | Матрица 2 на 2. Каждый элемент является Double . |
The InputArrayFormat
флаг управляет обработкой массивов. В этом примере значение для InputArrayFormat
флаг является значением по умолчанию, которое mwArrayFormatMatrix
. По умолчанию массив преобразуется в матрицу. Смотрите таблицу для результата преобразования var2
.
Чтобы задать массив ячеек (вместо матрицы) в качестве входа в вызов функции, установите InputArrayFormat
флаг в mwArrayFormatCell
вместо значения по умолчанию. Сделайте это в этом примере, добавив следующую линию после создания класса и перед вызовом метода:
aClass .MWFlags.ArrayFormatFlags.InputArrayFormat = mwArrayFormatCell
Установка флага на mwArrayFormatCell
приводит к преобразованию всех входов массива в инкапсулированную функцию MATLAB в массивы ячеек.
Точно так же можно манипулировать форматом выходных аргументов, используя OutputArrayFormat
флаг. Можно также изменить выход массива с помощью AutoResizeOutput
и TransposeOutput
флаги.
При вызове 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
В целом вы используете MWFlags
свойство class для изменения заданного поведения преобразования из Microsoft Visual Basic Variant
типы к типам MATLAB и наоборот. Существуют некоторые исключения - у некоторых типов, сгенерированных компилятором, есть свои MWFlags
свойство. При использовании этих типов вызов метода ведет себя в соответствии с настройками типа, а не класса, содержащего вызываемый метод. Исключения относятся к следующим типам, сгенерированным компилятором:
MWStruct
MWField
MWComplex
MWSparse
MWArg
Примечание
The MWArg
предоставляется специально для случая, когда конкретному аргументу требуются отличные параметры от свойств класса по умолчанию.