主要内容

控制数组格式和数据转换

概述

通常,您应该编写与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的数组数据范围在Visual Basic中编码为变体.由于MATLAB函数通常有矩阵参数,因此在处理来自Excel的数据时使用默认设置是有意义的。

OutputArrayFormat

mwArrayFormatAsIs

的数组变体

中列出的默认转换规则转换数组MATLAB到COM变量转换规则

mwArrayFormatMatrix

一个变体包含基本类型的数组。

mwArrayFormatCell

MATLAB单元格数组的通用实现变体数据。
AutoResizeOutput

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

TransposeOutput

转置所有数组输出。

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

使用数组格式化标志

考虑以下几点微软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标志控制如何处理数组。的值InputArrayFormatFlag是默认值,即mwArrayFormatMatrix.默认值将数组转换为矩阵。的转换结果见表var2

若要指定单元格数组(而不是矩阵)作为函数调用的输入,请设置InputArrayFormat旗帜mwArrayFormatCell而不是默认值。在本例中,在创建类之后和方法调用之前添加以下行:

aClass .MWFlags.ArrayFormatFlags。InputArrayFormat= mwArrayFormatCell

将标志设置为mwArrayFormatCell将封装MATLAB函数的所有数组输入转换为单元格数组。

修改输出格式

类也可以操作输出参数的格式OutputArrayFormat国旗。方法修改数组输出AutoResizeOutput而且TransposeOutput旗帜。

输出格式在VBScript

当在VBScript中调用COM对象时,你需要确保你设置了MWFlagsCOM对象为输出指定单元格数组。此外,必须使用枚举(单元格数组的枚举值为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类是专门为特定参数需要不同于默认类属性的设置时提供的。