主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

控制数组格式和数据转换

概述

通常,您应该编写应用程序代码,使其与您正在使用的 COM 对象中封装的 MATLAB® 函数的参量(输入和输出)相匹配。MATLAB 产品到 Microsoft® Visual Basic® 的参量映射完整描述于MATLAB 到 COM VARIANT 的转换规则COM VARIANT 到 MATLAB 的转换规则

在某些情况下,不可能完全匹配两种参量;例如,当现有的 MATLAB 代码与第三方产品(如 Microsoft Excel® 结合使用时。对于这些情况和其他情况,编译器支持格式化和转换标志,控制数组数据在两个方向(输入和输出)的格式化方式。

当创建组件时,编译器会包含一个名为 MWFlags 的组件属性。MWFlags 属性是可读和可写的。

MWFlags 属性由两组常量组成:arrayformattingflagsdataconversionflags。数组格式标志会影响数组的转换,而数据转换标志则处理单个数组元素的类型转换。

数组格式化标志

下表简要概述了如何使用数组格式标志来指定输入和输出参量的转换。

标志的名称标志的可能值转换结果
InputArrayFormat mwArrayFormatMatrix(默认)来自一般 Variant 数据的 MATLAB 矩阵。
mwArrayFormatCell来自一般 Variant 数据的 MATLAB 元胞数组。

Excelrange 内的数组数据在 Visual Basic 中被编码为 Variant 数组。由于 MATLAB 函数通常具有矩阵参量,因此在处理 Excel 数据时使用默认设置是有意义的。

OutputArrayFormat

mwArrayFormatAsIs

Variant 数组

根据列出的默认转换规则转换数组MATLAB 到 COM VARIANT 的转换规则

mwArrayFormatMatrix

包含基本类型数组的 Variant

mwArrayFormatCell

来自一般 Variant 数据的 MATLAB 元胞数组。
AutoResizeOutput

当设置此标志时,目标范围会自动调整大小以适合结果数组。如果未设置此标志,则目标范围必须至少与输出数组一样大,否则数据将被截断。对直接作为输出参数传递的 Excel Range 对象使用此标志。

TransposeOutput

转置所有数组输出。

处理输出为一维数组的封装 MATLAB 函数时使用此标志。默认情况下,MATLAB 产品将一维数组处理为 1× n 矩阵(即行向量)。如果您更喜欢列输出,请使用 TransposeOutput 标志更改此默认值。

使用数组格式化标志

考虑以下 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 变量,var1var2。这两个变量包含相同的数值数据,但它们的内部结构不同;一个是 2×2 的 variant 数组,另一个是 1×1 的 variant 数组。下表描述了各个变量。

场景var1var2
数值数据
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 标志来操作输出参量的格式。您还可以使用 AutoResizeOutputTransposeOutput 标志修改数组输出。

VBScript 中的输出格式

在 VBScript 中调用 COM 对象时,您需要确保为 COM 对象设置 MWFlags 以指定输出的元胞数组。此外,您必须使用枚举(元胞数组的枚举值为 2)来进行规范(而不是指定 mwArrayFormatCell)。

以下示例代码显示了如何实现这一点:

obj.MWFlags.ArrayFormatFlags.OutputArrayFormat = 2

使用数据转换标志

两个数据转换标志 CoerceNumericToTypeInputDateFormat 控制如何将数字和日期类型从 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 属性。当您使用这些特定类型时,方法调用将根据类型的设置而不是包含被调用方法的类的设置进行。编译器生成的以下类型属于例外:

  • MWStruct

  • MWField

  • MWComplex

  • MWSparse

  • MWArg

注意

MWArg 类专为特定参量需要与默认类属性不同的设置的情况而提供。