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