主要内容

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

数据转换

转换规则

本节介绍使用 MATLAB® Compiler SDK™ 产品创建的 COM 组件的数据转换规则。这些组件是双接口 COM 对象,支持与自动化兼容的数据类型。

注意

自动化(以前称为 OLE 自动化)是一种允许软件包向脚本工具和其他应用程序公开其独特功能的技术。自动化使用组件对象模型 (COM),但可以独立于其他 OLE 功能(例如就地激活)实现。

小心

请注意,IIS(Internet 信息服务)通常会阻止大多数 COM 自动化,因为它可能带来安全风险。因此,XLSREAD 和其他自动化服务在由 IIS 提供服务时可能会失败,从而导致 object reference not set 等错误。

MATLAB Compiler SDK 组件上调用方法时,输入参数将转换为 MATLAB 内部数组格式并传递给编译的 MATLAB 函数。当函数退出时,输出参数从 MATLAB 内部数组格式转换为 COM 自动化类型。

COM 客户端将编译后的 MATLAB 函数中的所有输入和输出参量作为 VARIANT 类型传递。COM VARIANT 类型是几种简单数据类型的联合。VARIANT 类型变量可以存储任何简单类型的变量,以及任何这些值的数组。

Win32 API 提供了许多用于在 C/C++ 中创建和操作 VARIANT 函数,而 Microsoft® Visual Basic® 为这种类型提供了本机语言支持。请参阅 Microsoft Visual Studio® 文档以了解 COM VARIANT 的定义和 API 支持 VARIANT 变量是自描述的,并将其类型代码存储为结构的内部字段。

注意

此处对数据的讨论涉及 VARIANTVariant 数据类型。VARIANT 是 C++ 名称,VARIANT 是 Visual Basic 中 Variant 的数据类型。

支持的 VARIANT 类型代码获取编译器组件支持的 VARIANT 类型代码列表。

MATLAB 到 COM VARIANT 的转换规则COM VARIANT 到 MATLAB 的转换规则用于 COM VARIANT 和 MATLAB 数组之间的转换规则。

支持的 VARIANT 类型代码

VARIANT 类型代码
(C/C++)
C/C++ 类型变量类型代码 (Visual Basic)Visual Basic 类型定义
VT_EMPTY-vbEmpty-

未初始化的 VARIANT

VT_I1char--

有符号单字节字符

VT_UI1

无符号 char

vbByteByte

无符号单字节字符

VT_I2shortvbIntegerInteger

有符号双字节整数

VT_UI2unsigned short--

无符号双字节整数

VT_I4longvbLongLong

有符号四字节整数

VT_UI4unsigned long--

无符号四字节整数

VT_R4floatvbSingleSingle

IEEE® 四字节浮点值

VT_R8doublevbDoubleDouble

IEEE 八字节浮点值

VT_CYCY+vbCurrencyCurrency

货币值(64 位整数,按 10,000 缩放)

VT_BSTRBSTR+vbStringString

字符串值

VT_ERRORSCODE+vbError-

HRESULT(表示 COM 错误代码的有符号四字节整数)

VT_DATEDATE+vbDateDate

表示日期和时间的八字节浮点值

VT_INTint--

有符号整数;等同于类型 int

VT_UINTunsigned int--

无符号整数;等效于 unsigned int 类型

VT_DECIMALDECIMAL+vbDecimal-

96 位(12 字节)无符号整数,按 10 的可变幂缩放

VT_BOOLVARIANT_BOOL+vbBooleanBoolean

两字节布尔值(0xFFFF = True;0x0000 = False)

VT_DISPATCHIDispatch*vbObjectObject

指向对象的 IDispatch* 指针

VT_VARIANTVARIANT+vbVariantVariant

VARIANT(仅当与 VT_BYREFVT_ARRAY 结合时才可指定)

<任何内容 >|VT_ARRAY   

按位组合 VT_ARRAY 与任意基本类型以声明为数组

<任何内容 >|VT_BYREF   

按位组合 VT_BYREF 与任何基本类型以声明为对值的引用

+表示 Windows® 特定类型。不是标准 C/C++ 的一部分。

MATLAB 到 COM VARIANT 的转换规则

MATLAB 数据类型标量数据的 VARIANT 类型数组数据的 VARIANT 类型注释
cell

1×1 元胞数组转换为单个 VARIANT,其类型符合元胞内容的 MATLAB 数据类型的转换规则。

多维单元元胞数组转换为 VARIANT 类型的 VT_VARIANT|VT_ARRAY,其中每个数组成员的类型符合相应单元格的 MATLAB 数据类型的转换规则。

structure

VT_DISPATCH

VT_DISPATCH

MATLABstruct 数组被转换为 MWStruct 对象。(请参阅类 MWStruct。该对象作为 VT_DISPATCH 类型传递。

char

1×1char 矩阵转换为 VARIANT 类型的 VT_BSTR,字符串长度 = 1。

在 MATLAB 中,假设一个 1×L 的 char 矩阵表示长度为 L 的字符串。这种情况转换为 VARIANT 类型的 VT_BSTR,其字符串长度 = L。多行或更高维度的 char 矩阵转换为 VARIANT 类型的 VT_BSTR|VT_ARRAY。转换后的数组中每个字符串的长度为 1,并且与原始矩阵中的每个字符相对应。

不支持将字符串数组作为 char 矩阵。要传递字符串数组,请使用 1×Lchar 矩阵的元胞数组。

sparse

VT_DISPATCH

VT_DISPATCH

MATLAB 稀疏数组被转换为 MWSparse 对象。(请参阅类 MWSparse。该对象作为 VT_DISPATCH 类型传递。

double

实数 1×1 双精度矩阵转换为 VARIANT 类型的 VT_R8。复杂的 1×1 双精度矩阵转换为 VARIANT 类型的 VT_DISPATCH

实数多维双精度矩阵转换为 VARIANT 类型的 VT_R8|VT_ARRAY
复杂的多维双精度矩阵转换为 VARIANT 类型的 VT_DISPATCH

使用 MWComplex 类,复杂数组可以在已编译的 MATLAB 函数之间传递。请参阅类 MWComplex

single

实数 1×1 单矩阵转换为 VARIANT 类型的 VT_R4。复杂的 1×1 单矩阵转换为 VARIANT 类型的 VT_DISPATCH

实数多维单矩阵转换为 VARIANT 类型的 VT_R4|VT_ARRAY
复杂的多维单矩阵转换为 VARIANT 类型的 VT_DISPATCH

使用 MWComplex 类,复杂数组可以在已编译的 MATLAB 函数之间传递。

int8

实数 1×1 int8 矩阵转换为 VARIANT 类型的 VT_I1。复杂的 1×1 int8 矩阵转换为 VARIANT 类型的 VT_DISPATCH

实数多维 int8 矩阵转换为 V VARIANT 类型的 T_I1|VT_ARRAY
复数多维 int8 矩阵转换为 VARIANT 类型的 VT_DISPATCH

使用 MWComplex 类,复杂数组可以在已编译的 MATLAB 函数之间传递。

uint8

实数 1×1 uint8 矩阵转换为 VARIANT 类型的 VT_UI1。复杂的 1×1 uint8 矩阵转换为 VARIANT 类型的 VT_DISPATCH

实数多维 uint8 矩阵转换为 VARIANT 类型的 VT_UI1|VT_ARRAY。复数多维 uint8 矩阵转换为 VARIANT 类型的 VT_DISPATCH

使用 MWComplex 类,复杂数组可以在已编译的 MATLAB 函数之间传递。

int16

实数 1×1 int16 矩阵转换为 VARIANT 类型的 VT_I2。复杂的 1×1 int16 矩阵转换为 VARIANT 类型的 VT_DISPATCH

实数多维 int16 矩阵转换为 VARIANT 类型的 VT_I2|VT_ARRAY。复杂的多维 int16 矩阵转换为 VARIANT 类型的 VT_DISPATCH

使用 MWComplex 类,复杂数组可以在已编译的 MATLAB 函数之间传递。

uint16

实数 1×1 uint16 矩阵转换为 VARIANT 类型的 VT_UI2。复杂的 1×1 uint16 矩阵转换为 VARIANT 类型的 VT_DISPATCH

实数多维 uint16 矩阵转换为 VARIANT 类型的 VT_UI2|VT_ARRAY。复杂的多维 uint16 矩阵转换为 VARIANT 类型的 VT_DISPATCH

使用 MWComplex 类,复杂数组可以在已编译的 MATLAB 函数之间传递。

int32

1×1 int32 矩阵转换为 VARIANT 类型的 VT_I4。复杂的 1×1 int32 矩阵转换为 VARIANT 类型的 VT_DISPATCH

多维 int32 矩阵转换为 VARIANT 类型的 VT_I4|VT_ARRAY。复杂的多维 int32 矩阵转换为 VARIANT 类型的 VT_DISPATCH

使用 MWComplex 类,复杂数组可以在已编译的 MATLAB 函数之间传递。

uint32

1×1 uint32 矩阵转换为 VARIANT 类型的 VT_UI4。复杂的 1×1 uint32 矩阵转换为 VARIANT 类型的 VT_DISPATCH

多维 uint32 矩阵转换为 VARIANT 类型的 VT_UI4|VT_ARRAY。复杂的多维 uint32 矩阵转换为 VARIANT 类型的 VT_DISPATCH

使用 MWComplex 类,复杂数组可以在已编译的 MATLAB 函数之间传递。

函数句柄

VT_EMPTY

VT_EMPTY

不支持

Java®

VT_EMPTY

VT_EMPTY

不支持

用户类

VT_EMPTY

VT_EMPTY

不支持

逻辑值

VT_Bool

VT_Bool|VT_ARRAY

COM VARIANT 到 MATLAB 的转换规则

VARIANT 类型MATLAB 数据类型(标量或数组数据)注释
VT_EMPTY

N/A

创建的数组为空。

VT_I1int8

VT_UI1uint8

VT_I2int16

VT_UI2uint16

VT_I4int32

VT_UI4uint32

VT_R4single

VT_R8double

VT_CYdouble

VT_BSTRchar

VARIANT 类型的 VT_BSTR 转换为 1×L 的 MATLABchar 数组,其中 L = 要转换的字符串的长度。VARIANT 类型的 VT_BSTR|VT_ARRAY 转换为 1×Lchar 数组的 MATLAB 元胞数组。

VT_ERRORint32

VT_DATEdouble

VARIANT 日期从 1899 年 12 月 31 日午夜开始以双精度形式存储 MATLAB 日期从 0/0/00 00:00:00 开始以双精度形式存储。因此,VARIANT 日期 MATLAB 映射到 MATLAB 数字日期 693960.0。VARIANT

VARIANT VARIANT 选择性地转换为字符串。看数据转换标志有关类型强制的更多信息。

VT_INTint32

VT_UINTuint32

VT_DECIMALdouble

VT_BOOLlogical

VT_DISPATCHVaries

IDispatch* 指针在其指向的上下文中被处理。对象必须是具有已知数据提取和转换规则的受支持类型,或者公开指向单个 Value 类型的通用 VARIANT 属性。从对象中提取的数据根据获得的特定 VARIANT 的规则进行转换。

目前,支持 Excel® Range 对象以及类型 MWStructMWComplexMWSparseMWArg。看引用实用工具类了解与 COM 组件一起使用的类型的信息。

anything|VT_BYREFVaries

指向任何基本类型的指针都会根据它们指向的规则进行处理。生成的 MATLAB 数组包含值的深度复制。

anything|VT_ARRAYVaries

多维 VARIANT 数组转换为多维 MATLAB 数组,每个元素根据基本类型的规则进行转换。VARIANT 类型的多维 VT_VARIANT|VT_ARRAY 数组转换为多维元胞数组,每个元胞根据该特定类型的规则进行转换。

数组格式化标志

这些组件具有控制如何在两个方向上格式化数组数据的标志。通常,您应该按照列出的规则开发客户端代码,将 MATLAB 函数的预期输入和输出与编译的 COM 对象上的相应方法相匹配MATLAB 到 COM VARIANT 的转换规则COM VARIANT 到 MATLAB 的转换规则。在某些情况下这是不可能的,例如当现有的 MATLAB 代码与第三方产品(如 Excel 结合使用时。

下表显示了数组格式标志。

数组格式化标志

标志 描述

InputArrayFormat

定义输入数组使用的数组格式规则。
输入数组是一个 VARIANT 数组,由客户端创建,作为输入参数发送到已编译 COM 对象上的方法调用。

此标志的有效值为 mwArrayFormatAsIsmwArrayFormatMatrixmwArrayFormatCell

mwArrayFormatAsIs 传递未改变的数组。

mwArrayFormatMatrix(默认)将所有数组格式化为矩阵。当输入 VARIANT 类型为 VT_ARRAY | type 时,其中 type 是任何数值类型,此标志不起作用。当输入 VARIANT 类型为 VT_VARIANT|VT_ARRAY 时,将检查数组中的 VARIANT。如果它们是单值并且类型同质,则会生成适当类型的 MATLAB 矩阵而不是元胞数组。

mwArrayFormatCell 将所有数组解释为 MATLAB 元胞数组。

InputArrayIndFlag

设置与 InputArrayFormat 标志一起使用的输入数组间接级别(仅适用于嵌套数组,即 VARIANTVARIANT 数组,它们本身也是数组)。此标志的默认值为零,它将 InputArrayFormat 标志应用于最外层数组。当此标志大于零(例如,等于 N)时,格式规则尝试将其自身应用于第 N 级嵌套。

OutputArrayFormat

定义输出数组使用的数组格式规则。输出数组是一个 MATLAB 数组,由已编译的 COM 对象创建,作为方法调用的输出参数发送到客户端。此标志的值 mwArrayFormatAsIsmwArrayFormatMatrixmwArrayFormatCell 导致与相应的 InputArrayFormat 标志值相同的行为。

OutputArrayIndFlag

(仅适用于嵌套元胞数组。)与 OutputArrayFormat 标志一起使用的输出数组间接级别。此标志的工作方式与 InputArrayIndFlag 完全相同。

AutoResizeOutput

(仅适用于 Excel 范围。)当方法调用的目标输出是 Excel 工作表中的单元格范围,并且在调用时不知道输出数组的大小和形状时,将此标志设置为 True 以调整每个 Excel 范围的大小以适合输出数组。

TransposeOutput

将此标志设置为 True 以转置输出参量。当从 Excel 调用组件时很有用,其中 MATLAB 函数以行向量形式返回输出,而您希望以列形式获取数据。

数据转换标志

MATLAB Compiler SDK 组件包含标志来控制某些 VARIANT 类型到 MATLAB 类型的转换。这些标志如下:

CoerceNumericToType

此标志指示数据转换器将所有数字 VARIANT 数据转换为一种特定的 MATLAB 类型。受此标志影响的 VARIANT 类型代码为 VT_I1VT_UI1VT_I2VT_UI2VT_I4VT_UI4VT_R4VT_R8VT_CYVT_DECIMALVT_INTVT_UINTVT_ERRORVT_BOOLVT_DATE。此标志的有效值为 mwTypeDefaultmwTypeCharmwTypeDoublemwTypeSinglemwTypeLogicalmwTypeInt8mwTypeUint8mwTypeInt16mwTypeUint16mwTypeInt32mwTypeUint32

此标志的默认值 mwTypeDefault 根据列出的规则转换数字数据数据转换

InputDateFormat

该标志告诉数据转换器如何将 VARIANT 日期转换为 MATLAB 日期。此标志的有效值为 mwDateFormatNumeric(默认)和 mwDateFormatString。默认按照列出的规则转换 VARIANT 日期支持的 VARIANT 类型代码mwDateFormatString 标志将 VARIANT 日期转换为其字符串表示形式。此标志仅影响 VARIANT 类型代码 VT_DATE

OutputAsDate As Boolean

此标志指示数据转换器将输出参量处理为日期。默认情况下,作为编译的 MATLAB 函数的输出参数的数字日期被传递为 Double,需要按 COM 日期偏差(693960)减少并强制转换为 COM 日期。将此标志设置为 True 可转换所有 Double 类型的输出值。

DateBias As Long

此标志设置执行 COM 到 MATLAB 数字日期转换的日期偏差。该属性的默认值为 693960,表示 COM Date 类型和 MATLAB 数字日期之间的差异。此标志允许已执行将数字日期增加 693960 的现有 MATLAB 代码与组件一起不加改变地使用。要使用此类代码处理日期,请将此属性设置为 0