Обычно необходимо записать код приложения так, чтобы он совпадал с аргументами (ввод и вывод) MATLAB® функции, которые инкапсулируются в COM-объектах, которые вы используете. Отображение аргументов от продукта MATLAB до Microsoft® Visual Basic® полностью описан в MATLAB к Правилам Преобразования ВАРИАНТА COM и ВАРИАНТУ COM к Правилам Преобразования MATLAB.
В некоторых случаях не возможно совпадать с двумя видами аргументов точно; например, когда существующий код MATLAB используется в сочетании со сторонним продуктом, таким как Microsoft Excel®. Для этих и других случаев, форматирования поддержек компилятора и флагов преобразования, которые управляют, как данные массива отформатированы в обоих направлениях (ввод и вывод).
Когда это создает компонент, компилятор включает свойство компонентов под названием MWFlags
. MWFlags
свойство читаемо и перезаписываемо.
MWFlags
свойство состоит из двух наборов констант: arrayformattingflags и dataconversionflags. Флаги форматирования массивов влияют на преобразование массивов, тогда как преобразование данных отмечает соглашение с преобразованиями типов отдельных элементов массива.
Следующие таблицы предоставляют быстрый обзор того, как использовать флаги форматирования массивов, чтобы задать преобразования для аргументов ввода и вывода.
Имя флага | Возможные значения флага | Результаты преобразования |
---|---|---|
InputArrayFormat | mwArrayFormatMatrix (значение по умолчанию) | Матрица MATLAB от общего Variant данные. |
mwArrayFormatCell | Массив ячеек MATLAB от общего Variant данные. | |
Данные массива от Excel | ||
OutputArrayFormat |
| Массив Variant |
Преобразует массивы согласно правилам преобразования по умолчанию, перечисленным в MATLAB к Правилам Преобразования ВАРИАНТА COM. | ||
| Variant содержа массив основного типа. | |
| Массив ячеек MATLAB от общего Variant данные. | |
AutoResizeOutput | Когда этот флаг установлен, целевой диапазон автоматически изменяет размер, чтобы соответствовать полученному массиву. Если этот флаг не установлен, целевой диапазон должен быть, по крайней мере, столь же большим как выходной массив, или данные являются усеченными. Используйте этот флаг для Excel | |
TransposeOutput |
Транспонирует весь массив выход. Используйте этот флаг при контакте с инкапсулированной функцией MATLAB, выход которой является одномерным массивом. По умолчанию продукт MATLAB обрабатывает одномерные массивы как 1 |
Рассмотрите следующее определение функции 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 . | 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
флаг. Можно также изменить массив выход с 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
свойство класса изменить заданные поведения преобразования из Microsoft Visual Basic Variant
типы к типам MATLAB, и наоборот. Существуют некоторые исключения — некоторые типы, сгенерированные компилятором, имеют свой собственный MWFlags
свойство. Когда вы используете эти конкретные типы, вызов метода ведет себя согласно настройкам типа а не класса, содержащего названный метод. Исключения для следующих типов, сгенерированных компилятором:
MWStruct
MWField
MWComplex
MWSparse
MWArg
Примечание
MWArg
класс предоставляется специально для случая, когда конкретному аргументу нужны различные настройки из свойств класса по умолчанию.