控制数组格式和数据转换
概述
通常,您应该编写应用程序代码,使其与您正在使用的 COM 对象中封装的 MATLAB® 函数的参量(输入和输出)相匹配。MATLAB 产品到 Microsoft® Visual Basic® 的参量映射完整描述于MATLAB 到 COM VARIANT 的转换规则和COM VARIANT 到 MATLAB 的转换规则。
在某些情况下,不可能完全匹配两种参量;例如,当现有的 MATLAB 代码与第三方产品(如 Microsoft Excel® 结合使用时。对于这些情况和其他情况,编译器支持格式化和转换标志,控制数组数据在两个方向(输入和输出)的格式化方式。
当创建组件时,编译器会包含一个名为 MWFlags 的组件属性。MWFlags 属性是可读和可写的。
MWFlags 属性由两组常量组成:arrayformattingflags和dataconversionflags。数组格式标志会影响数组的转换,而数据转换标志则处理单个数组元素的类型转换。
数组格式化标志
下表简要概述了如何使用数组格式标志来指定输入和输出参量的转换。
| 标志的名称 | 标志的可能值 | 转换结果 |
|---|---|---|
InputArrayFormat | mwArrayFormatMatrix(默认) | 来自一般 Variant 数据的 MATLAB 矩阵。 |
mwArrayFormatCell | 来自一般 Variant 数据的 MATLAB 元胞数组。 | |
Excel | ||
OutputArrayFormat |
| Variant 数组 |
根据列出的默认转换规则转换数组MATLAB 到 COM VARIANT 的转换规则。 | ||
| 包含基本类型数组的 Variant。 | |
| 来自一般 Variant 数据的 MATLAB 元胞数组。 | |
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 数组。 | 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 标志修改数组输出。
VBScript 中的输出格式
在 VBScript 中调用 COM 对象时,您需要确保为 COM 对象设置 MWFlags 以指定输出的元胞数组。此外,您必须使用枚举(元胞数组的枚举值为 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,则此代码可能会导致错误。一种解决方案是将 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
某些 Microsoft Visual Basic 类型的特殊标志
一般来说,您可以使用 MWFlags 类属性来更改从 Microsoft Visual BasicVariant 类型到 MATLAB 类型的转换的指定行为,反之亦然。有一些例外 - 编译器生成的某些类型有自己的 MWFlags 属性。当您使用这些特定类型时,方法调用将根据类型的设置而不是包含被调用方法的类的设置进行。编译器生成的以下类型属于例外:
MWStructMWFieldMWComplexMWSparseMWArg
注意
MWArg 类专为特定参量需要与默认类属性不同的设置的情况而提供。