主要内容

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

数据转换规则

本主题介绍 MATLAB® Compiler™ 组件的数据转换规则。这些组件是双接口 Microsoft® COM 对象,支持与自动化兼容的数据类型。

注意

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

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

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

Win32 应用程序接口 (API) 提供了许多用于在 C/C++ 中创建和操作 VARIANT 函数,而 Visual Basic® 为这种类型提供了本机语言支持。

注意

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

请参阅 Visual Studio® 文档以了解 COM VARIANT 的定义和 API 支持 VARIANT 变量是自描述的,并将其类型代码存储为结构的内部字段。

下表列出了 MATLAB Compiler 组件支持的 VARIANT 类型代码。

支持的 VARIANT 类型代码

VARIANT 类型代码
(C/C++)
C/C++ 类型Variant 类型代码
(Visual Basic)
Visual Basic 类型定义
VT_EMPTYvbEmpty

未初始化的 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 的规则。

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 (MATLAB Compiler SDK))该对象作为 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 (MATLAB Compiler SDK))该对象作为 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 函数之间传递。(请参阅类 MWComplex

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 函数之间传递。(请参阅类 MWComplex

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 函数之间传递。(请参阅类 MWComplex

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 函数之间传递。(请参阅类 MWComplex

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 函数之间传递。(请参阅类 MWComplex

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 函数之间传递。(请参阅类 MWComplex

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 函数之间传递。(请参阅类 MWComplex

函数句柄

VT_EMPTY

VT_EMPTY

不支持

Java®

VT_EMPTY

VT_EMPTY

不支持

用户类

VT_EMPTY

VT_EMPTY

不支持

逻辑值

VT_Bool

VT_Bool|VT_ARRAY

 

下表列出了从 COM 到 MATLAB 转换规则。

COM VARIANT 到 MATLAB 的转换规则

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

不适用

创建的数组为空。

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

1. 从 1899 年 12 月 31 日午夜开始,VARIANT 日期以双精度形式存储。MATLAB 日期以双精度形式存储,从 0/0/00 00:00:00 开始。因此,VARIANT 日期 0.0 映射到 MATLAB 数字日期 VARIANT 日期将转换为 MATLAB 双精度类型,并以 693960.0 为增量递增。
2. VARIANT 日期可以选择性地转换为字符向量。看数据转换标志有关类型强制的更多信息。

VT_INTint32 
VT_UINTuint32 
VT_DECIMALdouble 
VT_BOOLlogical 
VT_DISPATCH

视情况而定

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

目前,支持 Excel® Range 对象以及 MATLAB Compiler 类型 MWStructMWComplexMWSparseMWArg

<任何内容 >|VT_BYREF

视情况而定

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

<任何内容 >|VT_ARRAY

视情况而定

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