Control Array Formatting and Data Conversion
Overview
Generally, you should write your application code so that it matches the arguments (input and output) of the MATLAB® functions that are encapsulated in the COM objects that you are using. The mapping of arguments from the MATLAB product to Microsoft® Visual Basic® is fully described in MATLAB to COM VARIANT Conversion Rules and COM VARIANT to MATLAB Conversion Rules.
In some cases it is not possible to match the two kinds of arguments exactly; for example, when existing MATLAB code is used in conjunction with a third-party product such as Microsoft Excel®. For these and other cases, the compiler supports formatting and conversion flags that control how array data is formatted in both directions (input and output).
When it creates a component, the compiler includes a component property named
MWFlags
. The MWFlags
property is readable
and writable.
The MWFlags
property consists of two sets of constants:
arrayformattingflags
and dataconversionflags. Array formatting flags affect the
transformation of arrays, whereas data conversion flags deal with type conversions
of individual array elements.
Array Formatting Flags
The following tables provide a quick overview of how to use array formatting flags to specify conversions for input and output arguments.
Name of Flag | Possible Values of Flag | Results of Conversion |
---|---|---|
InputArrayFormat
| mwArrayFormatMatrix (default) | MATLAB matrix from general Variant
data. |
mwArrayFormatCell | MATLAB cell array from general Variant
data. | |
Array data from an
Excel
| ||
OutputArrayFormat |
| Array of Variant |
Converts arrays according to the default conversion rules listed in MATLAB to COM VARIANT Conversion Rules. | ||
| A Variant containing an array of a basic
type. | |
| MATLAB cell array from general Variant
data. | |
AutoResizeOutput | When this flag is set, the
target range automatically resizes to fit the resulting array.
If this flag is not set, the target range must be at least as
large as the output array or the data is truncated. Use this
flag for Excel
| |
TransposeOutput | Transposes all array output. Use this flag when dealing with an
encapsulated MATLAB function whose output is a one-dimensional array.
By default, the MATLAB product handles one-dimensional arrays as
1-by- |
Using Array Formatting Flags
Consider the following Microsoft
Visual Basic function definition for 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
The example has two Variant
variables, var1
and var2
. These two variables contain the same numerical data,
but internally they are structured differently; one is a 2-by-2 array of
variant
and the other is a 1-by-1 array of
variant
. The variables are described in the following
table.
Scenario | var1 | var2 |
---|---|---|
Numerical data |
11 12 21 22 |
11 12 21 22 |
Internal structure in Visual Basic | 2-by-2 array of Variant . Each
variant is a 1-by-1 array of
Double . | 1-by-1 Variant , which contains a 2-by-2 array
of Double |
Result of conversion by the compiler according to the default data conversion rules | 2-by-2 cell array. Each element is a 1-by-1 array of
double . | 2-by-2 matrix. Each element is a
Double . |
The InputArrayFormat
flag controls how the arrays are handled.
In this example, the value for the InputArrayFormat
flag is the
default, which is mwArrayFormatMatrix
. The default causes an
array to be converted to a matrix. See the table for the result of the conversion of
var2
.
To specify a cell array (instead of a matrix) as input to the function call, set
the InputArrayFormat
flag to mwArrayFormatCell
instead of the default. Do this in this example by adding the following line after
creating the class and before the method call:
aClass .MWFlags.ArrayFormatFlags.InputArrayFormat = mwArrayFormatCell
Setting the flag to mwArrayFormatCell
causes all array input to
the encapsulated MATLAB function to be converted to cell arrays.
Modifying Output Format
Similarly, you can manipulate the format of output arguments using the
OutputArrayFormat
flag. You can also modify array output
with the AutoResizeOutput
and
TransposeOutput
flags.
Output Format in VBScript
When calling a COM object in VBScript you need to make sure that you set
MWFlags
for the COM object to specify cell array for the
output. Also, you must use an enumeration (the enumeration value for a cell
array is 2) to make the specification (rather than specifying
mwArrayFormatCell
).
The following sample code shows how to accomplish this:
obj.MWFlags.ArrayFormatFlags.OutputArrayFormat = 2
Using Data Conversion Flags
Two data conversion flags, CoerceNumericToType
and
InputDateFormat
, govern how numeric and date types are
converted from Visual Basic to MATLAB.
This example converts var1
of type
Variant/Integer
to an int16
and
var2
of type Variant/Double
to a
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
If the original MATLAB function expects double
s for both arguments, this
code might cause an error. One solution is to assign a double
to
var1
, but this may not be possible or desirable. As an
alternative, you can set the CoerceNumericToType
flag to
mwTypeDouble
, causing the data converter to convert all
numeric input to double
. To do this, place the following line
after creating the class and before calling the methods:
aClass .MWFlags.DataConversionFlags.CoerceNumericToType = mwTypeDouble
The next example shows how to use the InputDateFormat
flag,
which controls how the Visual Basic
Date
type is converted. The example sends the current date and
time as an input argument and converts it to a string.
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
The next example uses an MWArg
object to modify the conversion
flags for one argument in a method call. In this case the first output argument
(y1
) is coerced to a Date
, and the second
output argument (y2
) uses the current default conversion flags
supplied by 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
Special Flags for Some Microsoft Visual Basic Types
In general, you use the MWFlags
class property to change
specified behaviors of the conversion from Microsoft
Visual Basic
Variant
types to MATLAB types, and vice versa. There are some exceptions — some types
generated by the compiler have their own MWFlags
property. When
you use these particular types, the method call behaves according to the settings of
the type and not of the class containing the method being called. The exceptions are
for the following types generated by the compiler:
MWStruct
MWField
MWComplex
MWSparse
MWArg
Note
The MWArg
class is supplied specifically for the case when
a particular argument needs different settings from the default class
properties.