Обычно необходимо записать код приложения так, чтобы он совпадал с аргументами (ввод и вывод) функций 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 предоставляется специально для случая, когда конкретному аргументу нужны различные настройки из свойств класса по умолчанию.