控制数组格式和数据转换
概述
通常,您应该编写与MATLAB的参数(输入和输出)相匹配的应用程序代码®被封装在您正在使用的COM对象中的函数。参数从MATLAB乘积到微软®Visual Basic®在MATLAB到COM变量转换规则而且COM变体到MATLAB转换规则.
在某些情况下,不可能完全匹配这两种参数;例如,当现有的MATLAB代码与第三方产品结合使用时,例如Microsoft Excel®.对于这些情况和其他情况,编译器支持格式化和转换标志,它们控制数组数据在两个方向(金宝app输入和输出)上的格式化方式。
当它创建一个组件时,编译器包含一个名为MWFlags
.的MWFlags
属性是可读和可写的。
的MWFlags
属性由两组常量组成:arrayformattingflags而且dataconversionflags.数组格式化标志影响数组的转换,而数据转换标志处理单个数组元素的类型转换。
数组格式化标志
下表简要介绍了如何使用数组格式化标志来指定输入和输出参数的转换。
船旗名称 | Flag的可能值 | 转换结果 |
---|---|---|
InputArrayFormat |
mwArrayFormatMatrix (默认) |
MATLAB矩阵的通用变体 数据。 |
mwArrayFormatCell |
MATLAB单元格数组的通用实现变体 数据。 |
|
来自Excel的数组数据 |
||
OutputArrayFormat |
|
的数组变体 |
中列出的默认转换规则转换数组MATLAB到COM变量转换规则. |
||
|
一个变体 包含基本类型的数组。 |
|
|
MATLAB单元格数组的通用实现变体 数据。 |
|
AutoResizeOutput |
设置此标志时,目标范围自动调整大小以适应结果数组。如果未设置此标志,则目标范围必须至少与输出数组一样大,否则数据将被截断。在Excel中使用此标志 |
|
TransposeOutput |
转置所有数组输出。 当处理输出为一维数组的封装MATLAB函数时,使用此标志。默认情况下,MATLAB产品将一维数组处理为1 × - |
使用数组格式化标志
考虑以下几点微软Visual Basic函数定义喷火
:
作为我的组件。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 .foo(1,y1,var1
这个例子有两个变体
变量,var1
而且var2
.这两个变量包含相同的数值数据,但内部结构不同;一个是2 × 2数组变体
另一个是1乘1数组变体
.变量说明如下表所示。
场景 | var1 | var2 |
---|---|---|
数值数据 |
11 12 21 22 |
11 12 21 22 |
Visual Basic中的内部结构 | 的2 × 2数组变体 .每一个变体 是一个1乘1的数组双 . |
1×1变体 的2 × 2数组双 |
编译器根据默认数据转换规则进行转换的结果 | 2 × 2单元格数组。每个元素都是一个1乘1的数组双 . |
2×2的矩阵。每个元素都是双 . |
的InputArrayFormat
标志控制如何处理数组。的值InputArrayFormat
Flag是默认值,即mwArrayFormatMatrix
.默认值将数组转换为矩阵。的转换结果见表var2
.
若要指定单元格数组(而不是矩阵)作为函数调用的输入,请设置InputArrayFormat
旗帜mwArrayFormatCell
而不是默认值。在本例中,在创建类之后和方法调用之前添加以下行:
aClass .MWFlags.ArrayFormatFlags。InputArrayFormat= mwArrayFormatCell
将标志设置为mwArrayFormatCell
将封装MATLAB函数的所有数组输入转换为单元格数组。
修改输出格式
类也可以操作输出参数的格式OutputArrayFormat
国旗。方法修改数组输出AutoResizeOutput
而且TransposeOutput
旗帜。
输出格式在VBScript
当在VBScript中调用COM对象时,你需要确保你设置了MWFlags
COM对象为输出指定单元格数组。此外,必须使用枚举(单元格数组的枚举值为2)来创建规范(而不是指定mwArrayFormatCell
).
下面的示例代码展示了如何实现这一点:
obj.MWFlags.ArrayFormatFlags.OutputArrayFormat = 2
使用数据转换标志
两个数据转换标志,CoerceNumericToType
而且InputDateFormat
,控制数字和日期类型如何从Visual Basic转换到MATLAB。
这个例子转换var1
类型的变体/整数
到一个int16
而且var2
类型的变体/双
到一个双
.
作为我的组件。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)退出子Handle_Error: MsgBox(Err.Description)结束子
如果原MATLAB函数期望双
如果两个参数都是S,这段代码可能会导致错误。一种解决方案是分配一个双
来var1
,但这可能是不可能或不可取的。作为一种替代方法,您可以设置CoerceNumericToType
旗帜mwTypeDouble
,导致数据转换器将所有数字输入转换为双
.要做到这一点,在创建类之后和调用方法之前放置以下一行:
aClass .MWFlags.DataConversionFlags。CoerceNumericToType = mwTypeDouble
下一个示例显示如何使用InputDateFormat
标志,该标志控制Visual Basic日期
类型转换。该示例将当前日期和时间作为输入参数发送,并将其转换为字符串。
作为我的组件。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调用aClass.foo(1,y,today)退出子Handle_Error: MsgBox(Err.Description)结束子
下一个例子使用了MWArg
对象修改方法调用中一个参数的转换标志。在本例中,第一个输出参数(日元
)被强迫日期
,第二个输出参数(y2
)使用的当前默认转换标志aClass
.
Sub foo(y1 As Variant, y2 As Variant) Dim class作为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调用类。foo(2, ytemp, y2, today) y1 = ytemp退出子Handle_Error: MsgBox(Err.Description)结束子
某些人的特殊旗帜微软Visual Basic类型
一般来说,使用MWFlags
类的属性来更改转换的指定行为微软Visual Basic变体
转换为MATLAB类型,反之亦然。有一些例外——编译器生成的一些类型有它们自己的类型MWFlags
财产。当您使用这些特定类型时,方法调用将根据类型的设置而不是包含被调用方法的类的设置进行行为。例外是针对编译器生成的以下类型:
MWStruct
MWField
MWComplex
MWSparse
MWArg
请注意
的MWArg
类是专门为特定参数需要不同于默认类属性的设置时提供的。